如何安全地运行不受信任的python代码?

如何安全地运行不受信任的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

下面是一个场景,我的网站有一些不安全的代码,这些代码是由网站用户生成的,要在我的服务器上运行

我想禁用python的一些保留字以保护我的运行环境,例如evalexecprint等等

有没有一种简单的方法(不改变python解释器,我的python版本是2.7.10)来实现我前面描述的功能


非常感谢。

一种方法是隐藏方法:

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

  • 或集装箱化(更轻),如或

在docker集装箱化的情况下,您可能需要添加AppArmor或SELinux政策以确保额外的安全性。默认情况下,lxd已附带AppArmor策略

确保以用户身份运行代码,并尽可能少地使用权限

为每个用户重建虚拟机/容器

无论使用哪种解决方案,都不要忘记限制资源使用(RAM、CPU、存储、网络)。如果您选择的虚拟化/容器化解决方案不支持这些限制,请使用


最后但并非最不重要的一点是,使用超时来防止用户的代码永远运行。

您的网站首先设计成一个沙箱吗,或者这是因为有人试图攻击你的网站而发生的事情吗?你可以在处理任何东西之前验证用户输入。它被设计成一个沙箱,允许用户执行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测试之前不会真正运行?