【发布时间】:2010-12-31 22:22:50
【问题描述】:
我正在建立一个网站,我需要用户应该能够根据 DB 表中的值评估一些表达式,而不是使用 pyparsing 等工具,我正在考虑使用 python 本身,并且已经提出有一个足以满足我目的的解决方案。我基本上是使用 eval 来评估表达式并使用空的__builtins__ 传递全局字典,这样就可以访问任何内容,并使用本地字典来获取数据库中的值,如果用户需要一些函数,我也可以传递这些函数,例如
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})
所以我的问题是它有多安全,我有三个标准
- 用户可以访问我的程序或表等的当前状态吗?
- 用户可以访问操作系统级别的调用吗?
- 用户可以通过循环或使用大量内存来暂停我的系统,例如通过执行 range(10*8),在某些情况下,他可以例如 100**1000 等,所以 3 并不是什么大问题。我可以用 tokenize 检查这样的操作,无论如何我将使用 GAE,所以这不是什么大问题。
编辑:IMO这不是Q:661084的副本,因为它从哪里开始,我想知道即使__builtins__被屏蔽,用户可以做坏事吗?
【问题讨论】: