是否可以限制 python 中的代码块对全局变量的访问?

Is it possible to restrict access to globals for a block of code in python?

我希望我的程序的用户能够在 python 中定义自定义脚本而不破坏程序。我正在看这样的东西:

def call(script):
  code = "access modification code" + script
  exec(code)

其中 "access modification code" 定义了一个范围,这样脚本只能访问它自己实例化的变量。是否可以执行此操作或具有类似功能的操作,例如创建一个具有自己范围的新 python 环境,然后从中接收输出?

感谢您的宝贵时间:)

澄清编辑 "I want to prevent both active attacks and accidental interaction with the program variables outside the users script (hence hiding all globals). The user scripts are intended to be small and inputted as text. The return of the user script needs to be immediate, as though it were native to the program."

在这种情况下,您要防止出现两个不同的问题:

  • 防止外部攻击者在 OS 用户执行您的程序的上下文中 运行 任意代码。这意味着防止 arbitrary code execution and privilege escalation
  • 防止程序的合法用户以意外方式更改程序行为。

对于第一个问题,你需要确保你执行的python代码的来源是用户。您不应该接受来自套接字或其他用户可以写入的文件的输入。您需要以某种方式确保 运行 正在使用提供输入的程序的用户。 实际解决方案将取决于您的 OS,但如果您将代码存储在文件中,您可能需要考虑设置限制性文件权限。

不要忽视或淡化这个问题,否则您的用户将成为 virus/malware/hackers 的受害者,感谢您的程序。


解决第二个问题的方法取决于程序中预期行为的确切构成。如果您对输出简单的数据结构感到满意,您可以 运行 在单独的进程中 用户输入的代码,并以序列化格式通过管道传递结果,例如作为 JSON 或 YAML。

这是一个非常简单的例子:

#remember to set restrictive file permissions on this file. This is OS-dependent
USER_CODE_FILE="/home/user/user_code_file.py"

#absolute path to python binary (executable)
PYTHON_PATH="/usr/bin/python"

import subprocess
import json

user_code= '''
import json
my_data= {"a":[1,2,3]}
print json.dumps(my_data)
'''

with open(USER_CODE_FILE,"wb") as f:
    f.write(user_code)

user_result_str= subprocess.check_output([PYTHON_PATH, USER_CODE_FILE])
user_result= json.loads( user_result_str )
print user_result

这是一个相当简单的解决方案,但开销很大。如果您需要在短时间内多次 运行 用户代码,请不要使用此选项。

最终,此解决方案仅对不成熟的攻击者(用户)有效。一般来说,没有办法保护任何用户进程不受用户本身的影响——这也没有多大意义。

如果您真的想要更多保证,并且也想缓解第一个问题,您应该 运行 将流程作为一个单独的 ("guest") 用户.这又是 OS 依赖的。


最后一个警告:尽你所能避免 execeval。它们不会保护您的程序或用户免受输入代码的侵害。网上有很多这方面的资料,搜索"python secure eval"

即可