gpt4 book ai didi

python - 运行能够与主程序通信但与系统隔离的不受信任的 python 代码

转载 作者:太空狗 更新时间:2023-10-29 21:58:15 24 4
gpt4 key购买 nike

序言:我知道很多人已经尝试在 Python 中对 Python 代码进行沙箱处理但失败了,但我还没有看到将脚本额外预处理为文本并拒绝包含 __base__< 等关键字的脚本的方法 可用于恢复隐藏的 __buuiltins__。我认为这种方法是新方法,尚未证明会失败 - 是吗?

我打算编写一款多人策略游戏,玩家通常不会使用键盘/鼠标命令与他们的单位互动,而只能通过他们必须提交的脚本来更改单位的自动行为。这是基于 http://screeps.com 的想法.

我很想用 Python 3 来写,但主要问题似乎是服务器上不受信任的外国玩家脚本的安全执行。我知道我可能不信任 exec()eval(),即使将它们传递给空的 globalslocals > 作为环境。我也知道简单地删除 __builtins__ 也不起作用,因为仍然可以使用 Python 的内省(introspection)功能轻松恢复它们,如下所述:http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html

我已经了解到 PyPy 或 Jython 可能具有某种沙盒功能,可能会满足我的目的,但我更愿意继续使用 CPython 引用解释器。此外,我只能找到这些沙盒功能适用于整个程序的示例,但没有一个示例包含将不受信任的脚本作为子线程运行并与它们有效通信的主程序。


但我想我还有一次机会:我可以按字面意思预处理提交的脚本并搜索像 __class____base__ 这样的字符串并拒绝包含这些关键字的脚本。我还必须用我自己的安全函数替换脚本中的 eval()exec(),这些函数也拒绝运行包含这些关键字的代码。

这种方法连同使用 exec() 的自定义 globals 参数覆盖所有具有潜在危险的项目(会是哪些?)是否安全? ?我必须寻找哪些关键字?

如果不是,为什么会失败?您能提出更好的解决方案吗?

最佳答案

我不确定这是个好主意。有可能使用 pypy,甚至是专用项目 python sandbox这已经解决了很多系统隔离问题。但前者需要大量工作来构建安全环境,后者不直接支持Python 3.x

但是pysandbox的作者从2013年开始就停止开发了,因为他在其github site中声明了

pysandbox is BROKEN BY DESIGN, please move to a new sandboxing solution (run python in a sandbox, not the opposite!) https://lwn.net/Articles/574215/*

如果您可以接受有限的语法,那么使用 PythonLexYacc 定义专用语法并构建自定义解释器肯定会安全得多。 .

我必须承认这是比完整答案更多的提示,但这是我现在能做的最好的(并且未引用 python 沙箱 that former SO question

关于python - 运行能够与主程序通信但与系统隔离的不受信任的 python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35700089/

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