- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
序言:我知道很多人已经尝试在 Python 中对 Python 代码进行沙箱处理但失败了,但我还没有看到将脚本额外预处理为文本并拒绝包含 __base__< 等关键字的脚本的方法
可用于恢复隐藏的 __buuiltins__
。我认为这种方法是新方法,尚未证明会失败 - 是吗?
我打算编写一款多人策略游戏,玩家通常不会使用键盘/鼠标命令与他们的单位互动,而只能通过他们必须提交的脚本来更改单位的自动行为。这是基于 http://screeps.com 的想法.
我很想用 Python 3 来写,但主要问题似乎是服务器上不受信任的外国玩家脚本的安全执行。我知道我可能不信任 exec()
或 eval()
,即使将它们传递给空的 globals
和 locals
> 作为环境。我也知道简单地删除 __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/
我正在使用 Java 编写一个时钟程序,该程序能够“滴答作响”,但它存在问题。我认为它与 getter 和 setter 或 toString() 方法有关。 计数器类 package clock;
const Index = () => { // Ref Links const frefLinks = { 1: useRef(1), 2: useRef(2), 3: useRef(3
所以我读了here不能 pickle 装饰函数。确实: import multiprocessing as mp def deco(f): def wrapper(*args, **kwarg
我在go1.11.2 linux/amd64 版本。当包godog使用 go get github.com/DATA-DOG/godog/ 安装,godog 可执行文件在 $GOPATH/bin/中创
如何正确压缩字符串,以便 PHP 能够解压缩? 我试过这个: public static byte[] compress(String string) throws IOException {
我们这里的问题是表明 在测试中使用 Kleene 代数。 在 b 的值由 p 保留的情况下,我们有交换条件 bp = pb;两个程序之间的等价性简化为等式 在 b 的值不被 p 保留的情况下,我们有交
我有一个与我的网络相关的非常奇怪的问题,我在具有多个接口(interface)的 VirtualBox 上安装了 RDO Grizzly OpenStack。 虚拟盒子: eth0 - managem
我正在尝试使用 Passport.js授权谷歌OAuth2在 Node.js .我整个星期都在尝试让它工作,但不知道为什么它不工作,所以现在我求助于 stack 寻求一些潜在的帮助。我已经尝试了所有在
我是一名优秀的程序员,十分优秀!