使用eval进行表达式评估有多安全?

Anu*_*yal 3 python security eval

我正在构建一个网站,我需要用户能够根据数据库表中的值来评估某些表达式,而不是使用像pyparsing等工具,我正在考虑使用python本身,并提出了一个解决方案这足以达到我的目的.我基本上使用eval来评估表达式并传递全局变量dict为空,__builtins__这样就没有任何东西可以被访问,本地人会为DB中的值进行dict,如果用户需要一些函数我也可以传递它们,例如

import datetime
def today():
    return datetime.datetime.now()

expression = """ first_name.lower() == "anurag" and today().year == 2010 """

print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
Run Code Online (Sandbox Code Playgroud)

所以我的问题是它有多安全,我有三个标准

  1. 用户可以访问我的程序或表等的当前状态吗?
  2. 用户可以访问操作系统级别的呼叫吗?
  3. 用户可以通过循环或使用大量内存来暂停我的系统,例如通过范围(10*8),在某些情况下,他可以例如100**1000等,因此3不是一个问题.我可以使用tokenize检查这样的操作,无论如何我将使用GAE因此它并不是很关注.

编辑:IMO这不是Q:661084的重复,因为它结束了这一个开始,我想知道即使__builtins__被阻止,用户可以做坏事吗?

Ale*_*lli 7

使用它是完全不安全的eval,即使内置程序被清空和阻塞 - 攻击者可以从文字开始,获取它__class__等等,直到object__subclasses__,等等...基本上,Python内省太强大了站出来对待一个技术娴熟,坚定的攻击者.

ast.literal_eval 安全的,如果你可以忍受它的局限......

  • 你可以得到*任何*类型或类的提示(通过向上移动到`object`,例如通过`__class__`和`__mro__`或`__bases__`,然后通过`__subclasses__`,......)应该足够了“反例”:让想要玩破坏性恶作剧的恶意黑客至少工作一分钟来构建他们的解决方案......!-) (2认同)