gpt4 book ai didi

Python - 创建一个 "scripting"系统

转载 作者:太空狗 更新时间:2023-10-29 21:04:16 25 4
gpt4 key购买 nike

我正在制作一个 wxpython 应用程序,我将使用各种卡住实用程序对其进行编译,以创建适用于多个平台的可执行文件。

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

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

我希望系统像这样工作。

用户将他们希望运行的 python 脚本放入样式化的文本框中,然后按下按钮来执行脚本。

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

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

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

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

编辑:关于给出的答案

到目前为止,我觉得没有任何答案真正回答了我的问题是的,他们得到了部分回答,但没有完全回答。我很清楚完全停止不安全代码是不可能的。人们太聪明了,一个人(甚至一个团队)无法想出所有方法来绕过安全系统并阻止它们。

事实上,我真的不在乎他们是否在乎。我更担心有人无意中破坏了他们不知道的东西。如果有人真的想要,他们可以使用脚本功能将应用程序撕成碎片,但我一点也不在乎。这将是他们的实例,当他们重新启动应用程序时,他们创建的所有问题都会消失,除非他们弄乱了 HD 上的文件。我想防止用户做一些愚蠢的事情时出现的问题。
诸如 IOError、SystaxErrors、InfiniteLoopErrors 等问题。

现在关于范围的部分已经回答了。我现在明白了如何定义可以从 eval 函数访问哪些函数和全局变量但是有没有办法确保在执行时间过长时可以停止执行他们的代码?
也许是绿色线程系统? (绿色是因为 eval 让用户担心线程安全)

还有如果用户使用import module 语句从类的其余部分未使用的默认库加载模块。这会导致应用程序被 Py2exe、Py2app 或 Freeze 卡住的问题吗?如果他们在标准库之外调用模态怎么办?模式出现在与卡住的可执行文件相同的目录中就足够了吗?

我想在不创建新问题的情况下获得这些答案,但如果必须的话,我会的。

最佳答案

简单的回答:不要。

您可以禁止某些关键字(import)和操作,以及对某些数据结构的访问,但最终您会为高级用户提供相当多的权力。由于这是针对在用户机器上运行的富客户端,如果恶意用户真的愿意,他们可能会崩溃甚至破坏整个应用程序。但这是他们崩溃的例子。妥善记录并告诉人们不要触摸什么。

就是说,我已经为执行用户输入的 Web 应用程序做了这种事情,是的,像这样调用 eval:

eval(code, {"__builtins__":None}, {safe_functions})

其中 safe_functions 是一个字典,包含 {"name": func} 您希望用户能够访问的函数对类型。如果有一些您肯定的基本数据结构是您的用户永远不想戳的,只需在将其传入之前将其从 globals 中弹出即可。

顺便说一句,Guido 不久前在他的博客上解决了这个问题。我看看能不能找到它。

编辑: found.

关于Python - 创建一个 "scripting"系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com