gpt4 book ai didi

python - 限制 Python 的语法以安全地执行用户代码。这是一种安全的方法吗?

转载 作者:太空狗 更新时间:2023-10-29 20:23:10 24 4
gpt4 key购买 nike

原始问题:

Executing mathematical user code on a python web server, what is the simplest secure way?

  • 我希望能够在 python 网络服务器上运行用户提交的代码。该代码本质上将是简单的和数学的。

由于需要这么小的 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
'Num', 'Tuple', 'List',
#Operations
'BinOp', 'Add', 'Sub', 'Mult', 'Div', 'Mod', 'Compare'
])

safe_names = set([
'True', 'False', 'None'
])


class SyntaxChecker(ast.NodeVisitor):

def check(self, syntax):
tree = ast.parse(syntax)
self.visit(tree)

def visit_Call(self, node):
if node.func.id not in allowed_functions:
raise SyntaxError("%s is not an allowed function!"%node.func.id)
else:
ast.NodeVisitor.generic_visit(self, node)

def visit_Name(self, node):
try:
eval(node.id)
except NameError:
ast.NodeVisitor.generic_visit(self, node)
else:
if node.id not in safe_names and node.id not in allowed_functions:
raise SyntaxError("%s is a reserved name!"%node.id)
else:
ast.NodeVisitor.generic_visit(self, node)

def generic_visit(self, node):
if type(node).__name__ not in allowed_node_types:
raise SyntaxError("%s is not allowed!"%type(node).__name__)
else:
ast.NodeVisitor.generic_visit(self, node)

if __name__ == '__main__':
x = SyntaxChecker()
while True:
try:
x.check(raw_input())
except Exception as e:
print e

这似乎接受了所需的语法,但我对编程相当陌生,可能会遗漏任何数量的安全漏洞。

所以我的问题是:这是否安全,是否有更好的方法,还有我应该采取的任何其他预防措施吗?

最佳答案

我注意到有两点您仍然可以改进:

您应该始终对可以从某种形式的用户输入生成的任何输出进行转义。在您的示例中,不允许的标识符将未经修改地镜像回输出。这可能会被利用,一个例子是 Cross Site Scripting .因此,我会另外转义任何此类错误消息以防止这种情况发生。

您需要注意的另一件事是拒绝服务攻击。想象一下,有人启动了一个 Ackermann 函数和一个脚本,将其提交到您的服务器几千次……为防止这种情况发生,您应该对提交的任何代码的执行时间进行计时。这是必不可少的,因为这种类型的“攻击”通常是无意中发生的 - 有人设法产生了无限循环。

编辑:

最后,我还建议更新您的 Python 版本以防止 "hashDoS" attack .

关于python - 限制 Python 的语法以安全地执行用户代码。这是一种安全的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com