stringExp = "2^4"
intVal = int(stringExp) # Expected value: 16
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int()
with base 10: '2^4'
Run Code Online (Sandbox Code Playgroud)
我知道eval可以解决这个问题,但是不是有更好的 - 更重要的 - 更安全的方法来评估存储在字符串中的数学表达式吗?
我正在开发纯Python的网页游戏,并希望有一些简单的脚本可用于更多动态的游戏内容.特权用户可以实时添加游戏内容.
如果脚本语言可以是Python,那就太好了.但是,由于恶意用户可能会造成严重破坏,因此无法在访问游戏运行环境的情况下运行.是否可以在纯Python中运行沙盒Python?
更新:事实上,由于真正的Python支持会有点过分,因此使用Pythonic语法的简单脚本语言将是完美的.
如果没有任何Pythonic脚本解释器,是否有任何其他开源脚本解释器用纯Python编写,我可以使用?要求是对变量,基本条件和函数调用(不是定义)的支持.
我想要一种简单的方法在Python中执行"计算器API".
现在,我并不关心计算器将支持的确切功能集.
我希望它接收一个字符串,"1+1"并在我们的例子中返回一个包含结果的字符串"2".
有没有办法让eval这种东西安全?
首先,我会这样做
env = {}
env["locals"] = None
env["globals"] = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None
eval(users_str, env)
Run Code Online (Sandbox Code Playgroud)
这样调用者就不会搞乱我的局部变量(或看到它们).
但我相信我在这里监督很多.
eval安全问题是否可以解决,或者是否存在太多微小的细节以使其正常工作?
众所周知,使用eval()是一种潜在的安全风险,因此ast.literal_eval(node_or_string)促进了使用
但是在python 2.7中,它ValueError: malformed string在运行此示例时返回:
>>> ast.literal_eval("4 + 9")
Run Code Online (Sandbox Code Playgroud)
而在python 3.3中,此示例按预期工作:
>>> ast.literal_eval('4+9')
13
Run Code Online (Sandbox Code Playgroud)
为什么它运行在python 3而不是python 2?如何在不使用冒险eval()功能的情况下在python 2.7中修复它?
原始问题:
在python Web服务器上执行数学用户代码,最简单的安全方法是什么?
由于需要Python的一小部分,我目前的方法是通过遍历Python的抽象语法树将允许的语法列入白名单.功能和名称得到特殊待遇; 只允许明确列入白名单的函数,并且只允许使用未使用的名称.
import ast
allowed_functions = set([
#math library
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf',
'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod',
'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp',
'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians',
'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc',
#builtins
'abs', 'max', 'min', 'range', 'xrange'
])
allowed_node_types = set([
#Meta
'Module', 'Assign', 'Expr',
#Control
'For', 'If', 'Else',
#Data
'Store', 'Load', 'AugAssign', 'Subscript',
#Datatypes …Run Code Online (Sandbox Code Playgroud) 我之前已经意识到这个问题,但是这种情况略有不同.
我想运行一个python图像板(使用web.py),这将允许用户通过提交代码生成新图像.代码将采用单个函数的形式,它采用像素的x,y坐标并返回r,g,b值,例如:
def simpleGradient(xrel,yrel):
r = xrel*256
g = yrel*256
b = 0
return [r,g,b]
Run Code Online (Sandbox Code Playgroud)
只需要非常小的语法,它不一定是python.使用exec有限的范围似乎太不安全了,使用PyPy或VM似乎不必要地复杂(我对这一切都很新).
而不是沙箱化,是否有一种pythonic方式以更小的语言执行代码?是python的一个子集(解析和白名单?),还是我可以嵌入的数学导向语言?
我正在寻找一个“安全”的 eval 函数来实现类似电子表格的计算(使用 numpy/scipy)。
由于明显无法修复的安全问题,执行此操作的功能(rexec 模块)自 2.3 以来已从 Python 中删除。有几个第三方黑客声称这样做 - 我发现的最深思熟虑的解决方案是 这个 Python Cookbok recipe,“safe_eval”。
如果我使用它(或类似的东西)来防止恶意代码,我是否相当安全,或者我是否坚持编写自己的解析器?有谁知道任何更好的选择?
编辑:我刚刚发现了RestrictedPython,它是 Zope 的一部分。欢迎对此提出任何意见。
如果攻击者可以控制其价值attacker_controlled_nasty_variable,那么这部分代码是否容易受到攻击?
dic={"one":1,
"nasty":attacker_controlled_nasty_variable,
}
store=str(dict)
...
dic=eval(store)
Run Code Online (Sandbox Code Playgroud) 我正在构建一个网站,我需要用户能够根据数据库表中的值来评估某些表达式,而不是使用像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__被阻止,用户可以做坏事吗?