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)
所以我的问题是它有多安全,我有三个标准
编辑:IMO这不是Q:661084的重复,因为它结束了这一个开始,我想知道即使__builtins__被阻止,用户可以做坏事吗?
使用它是完全不安全的eval,即使内置程序被清空和阻塞 - 攻击者可以从文字开始,获取它__class__等等,直到object它__subclasses__,等等...基本上,Python内省太强大了站出来对待一个技术娴熟,坚定的攻击者.
ast.literal_eval 是安全的,如果你可以忍受它的局限......