python是否可以在一个全局代码块中限制访问?

2024-03-28 12:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的程序的用户能够在不破坏程序的情况下用python定义自定义脚本。我看到的是这样的东西:

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

其中“访问修改代码”定义了一个范围,使得脚本只能访问它自己实例化的变量。有没有可能使用类似的功能来完成这项工作或其他类似的工作,例如创建一个具有自己范围的新python环境,然后从中接收输出?在

感谢您抽出时间:)

澄清编辑 “我想防止主动攻击和与用户脚本外的程序变量的意外交互(因此隐藏了所有全局变量)。用户脚本应该很小,并以文本形式输入。用户脚本需要立即返回,就像它是程序的本机脚本一样。”


Tags: 实例代码用户程序功能脚本定义access
1条回答
网友
1楼 · 发布于 2024-03-28 12:32:32

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

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

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

不要忽视或淡化此问题,否则您的用户将成为病毒/恶意软件/黑客的牺牲品。


解决第二个问题的方法取决于程序中的预期行为的具体构成。如果您对输出简单的数据结构感到满意,您可以在单独的进程中运行用户输入的代码,并将结果以序列化格式(如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”)用户运行流程。这也是操作系统依赖的。在


最后一个警告:尽量避免exec和{}。它们既不能保护你的程序也不能保护用户不受输入代码的影响。网上有很多关于这个的信息,只要搜索“python secure eval”

相关问题 更多 >