【问题标题】:Is it possible to restrict access to globals for a block of code in python?是否可以限制对 python 中代码块的全局变量的访问?
【发布时间】:2015-02-25 19:14:42
【问题描述】:

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

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

“访问修改代码”定义了一个范围,使得脚本只能访问它自己实例化的变量。是否可以这样做或具有类似功能的东西,例如创建一个具有自己作用域的新 python 环境,然后从它接收输出?

感谢您的宝贵时间:)

澄清编辑 “我想防止主动攻击和与用户脚本之外的程序变量的意外交互(因此隐藏所有全局变量)。用户脚本旨在很小并作为文本输入。用户脚本的返回需要立即,就好像它是程序原生的一样。”

【问题讨论】:

  • 欢迎来到 StackOverflow!这是一个有趣的第一个问题,但我认为您需要详细说明“不破坏程序”的含义。您是在尝试防止意外损坏,还是主动攻击?另外,你需要接收什么样的输出,有多大?纯文本? 500 MB/s 的二进制流?您是希望无限期地等待该输出,还是希望超时?
  • 我想防止主动攻击和与用户脚本之外的程序变量的意外交互(因此隐藏所有全局变量)。用户脚本旨在很小并作为文本输入。用户脚本的返回必须是即时的,就好像它是程序原生的一样。
  • 这样就更清楚了。您可能需要编辑您的问题以包含此信息,以便所有人都能看到它

标签: python scope runtime exec


【解决方案1】:

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

  • 防止外部攻击者在操作系统用户执行您的程序的上下文中运行任意代码。这意味着阻止arbitrary code executionprivilege escalation
  • 防止程序的合法用户以非预期方式更改程序行为。

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

不要忽视或淡化这个问题,否则您的用户将成为病毒/恶意软件/黑客的受害者,这要归功于您的程序。


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

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

#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

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

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

如果您真的想要更多的保证,并且也想缓解第一个问题,您应该以单独的(“来宾”)用户身份运行该过程。这又是依赖于操作系统的。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2019-05-27
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多