Python - 创建"脚本"系统

Rye*_*yex 8 python security scripting wxpython eval

我正在制作一个wxpython应用程序,我将使用各种冻结实用程序进行编译,以便为多个平台创建可执行文件.

该程序将成为基于图块的游戏引擎的地图编辑器

在这个应用程序中,我想提供一个脚本系统,以便高级用户可以修改程序的行为,如修改项目数据,将项目导出到不同的格式等.

我希望系统能像这样工作.

用户将他们希望运行的python脚本放入样式文本框中,然后按一个按钮执行脚本.

到目前为止,我很擅长这一切,这些都非常简单.从文本框中获取脚本作为字符串使用内置函数compile()将其编译为cod对象,然后使用exec语句执行脚本

script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
Run Code Online (Sandbox Code Playgroud)

问题是,我想确保此功能不会导致任何错误或错误,
如果脚本中有import语句.考虑到代码是用py2exe或py2app之类的东西编译的,这会导致任何问题吗?
我如何确保用户不能破坏程序的关键部分,如修改部分GUI,同时仍允许他们修改项目数据(数据保存在自己的模块中的全局属性中)?我认为这意味着修改传递给eval函数的全局变量dict.
如何确保此eval不会导致程序因长循环或无限循环而挂起?如何确保用户代码中引发的错误不会导致整个应用程序崩溃?

基本上,如何避免在允许用户运行自己的代码时可能出现的所有问题?

编辑:关于给出的答案

我觉得到目前为止任何答案都没有真正回答我的问题,是的,他们已经得到了部分回答,但并未完全回答.我很清楚,不可能完全停止不安全的代码.对于一个人(甚至是一个人)而言,人们过于聪明地想到绕过安全系统并阻止它们的所有方法.

事实上,如果他们这样做,我真的不在乎.我更担心一些人无意中打破了他们不知道的事情.如果有人真的想要他们可以通过脚本功能撕毁应用程序,但我不在乎.这将是他们的实例,他们创建的所有问题将在他们重新启动应用程序时消失,除非他们已经搞乱了HD上的文件.我想防止用户给某些东西愚蠢时出现的问题.
像IOError,SystaxErrors,InfiniteLoopErrors等.

现在关于范围的部分已得到解答.我现在明白如何定义可以从eval函数访问哪些函数和全局变量但是有没有办法确保如果它花费太长时间可以停止执行它们的代码?
也许是一个绿色线程系统?(绿色,因为它会让用户担心线程安全性)

此外,如果用户使用import module语句从甚至未在类的其余部分中使用的默认库加载模块.这会导致应用被Py2exe,Py2app或Freeze冻结的问题吗?如果他们称标准库的模态外?模态是否与冻结的可执行文件存在于同一目录中是否足够?

我想在没有创建新问题的情况下得到这些答案,但如果必须,我会这样做.

nmi*_*els 5

答案很简单:不要.

您可以禁止某些关键字(import)和操作,以及访问某些数据结构,但最终您将为您的高级用户提供相当大的功能.由于这是针对在用户计算机上运行的富客户端,恶意用户可能会崩溃甚至丢弃整个应用程序,如果他们真的喜欢它.但这是他们崩溃的实例.记录好并告诉人们不要碰的东西.

也就是说,我已经为执行用户输入的web应用做了这样的事情,是的,调用eval是这样的:

eval(code, {"__builtins__":None}, {safe_functions})
Run Code Online (Sandbox Code Playgroud)

其中safe_functions是一个字典,包含{"name": func}您希望用户能够访问的类型的函数对.如果有,你是一些基本的数据结构,积极的用户将永远不会想在戳,刚刚流行出来的globals传递它们之前.

顺便说一下,Guido刚才在他的博客上解决了这个问题.我会看看能不能找到它.

编辑: 找到.