如何安全地运行不受信任的python代码?
下面是一个场景,我的网站有一些不安全的代码,这些代码是由网站用户生成的,要在我的服务器上运行 我想禁用python的一些保留字以保护我的运行环境,例如eval、exec、print等等 有没有一种简单的方法(不改变python解释器,我的python版本是2.7.10)来实现我前面描述的功能如何安全地运行不受信任的python代码?,python,sandbox,Python,Sandbox,下面是一个场景,我的网站有一些不安全的代码,这些代码是由网站用户生成的,要在我的服务器上运行 我想禁用python的一些保留字以保护我的运行环境,例如eval、exec、print等等 有没有一种简单的方法(不改变python解释器,我的python版本是2.7.10)来实现我前面描述的功能 非常感谢。一种方法是隐藏方法: def not_available(*args, **kwargs): return 'Not allowed' eval = not_available exec
非常感谢。一种方法是隐藏方法:
def not_available(*args, **kwargs):
return 'Not allowed'
eval = not_available
exec = not_available
print = not_available
但是,聪明的人总能做到这一点:
import builtins
builtins.print('this works!')
因此,真正的解决方案是解析代码,如果它有这样的语句,就不允许输入(而不是试图禁用它们)。在python级别禁用名称不会有帮助,因为有很多方法可以解决这个问题。有关更多信息,请参阅和发布。这是您需要做的: 对于CPython,用于定义Python的受限子集 对于PyPy,使用。它允许您在序列化所有输入/输出的特殊环境中运行任意python代码,以便在实际运行命令之前检查并确定允许使用哪些命令 由于3.8版Python支持,因此您可以完全阻止某些操作: 导入系统 def审核(事件、参数): 如果事件==“编译”: sys.exit('nice try!') sys.addaudithook(审计) 评估('5') 此外,为了保护您的主机操作系统,请使用
- 虚拟化(更安全),如KVM或VirtualBox
- 或集装箱化(更轻),如或
最后但并非最不重要的一点是,使用超时来防止用户的代码永远运行。您的网站首先设计成一个沙箱吗,或者这是因为有人试图攻击你的网站而发生的事情吗?你可以在处理任何东西之前验证用户输入。它被设计成一个沙箱,允许用户执行python代码来访问位于我的服务器上的用户定义的数据。
eval
不是一个关键字,而是一个函数<代码>评估=8;打印评估;验证代码的最佳方法是将其解析为,然后扫描树以查找不安全的内容。然而。。。请参阅。感谢您提醒eval
和建议。对您有好处!我还尝试禁用一些特定模块,如操作系统、线程和内置模块……不幸的是,这对Python 2.7中的exec
不起作用,因为exec
是一个语句,而不是函数,因此任何分配给exec
的尝试都会引发SyntaxError:invalid syntax
。要使其适用于print
,您需要使用from\uuuuuu future\uuuuu导入print\u函数来禁用print
语句。@diaosihuai:您可以执行一个简单的字符串或正则表达式测试,以查看用户代码是否包含exec语句。OTOH,可能最好使用来处理用户代码。@PM 2Ring使用ast检查用户代码是否包含这些敏感关键字,如果结果为真,则停止。所以用户代码在通过ast测试之前不会真正运行?