我正在建立一个网站,我有一个需要,用户应该能够评估一些表达式基于数据库表中的值,而不是使用像pyparsing等工具,我正在考虑使用python本身,并且已经想出了一个足以达到我的目的的解决方案。我基本上使用eval来评估表达式并传递全局空字符__builtins__
,这样就不会有任何东西可以被访问,并且当地人从DB中得到值,如果用户需要某些函数,我也可以通过这些函数。使用eval进行表达式评估安全性如何?
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})
所以我的问题是,如何安全是,我有三个标准
- 我的程序或表格等someshow的用户访问当前的状态可以吗?
- 用户可以访问os级别的调用吗?
- 用户可以通过循环或使用大量内存来暂停我的系统,例如通过做范围(10 * 8),在某些情况下,他可以例如100 ** 1000等等,所以3不是一个问题。我可以使用标记来检查这样的操作,无论如何,我将使用GAE,所以它不是很关心。
编辑:IMO这不是Q:661084重复的,因为在那里结束这一个开始,我想知道,即使__builtins__
堵塞,用户可以做坏事?
检查:http:// stackoverflow。com/questions/661084/pythons -eval-on-untrusted-strings – fserb 2010-01-03 05:36:19
@fserb查看编辑 – 2010-01-03 05:40:59