在沙箱环境中使用socket模块
我正在尝试让一个用Pypy创建的子进程在一个受限制的环境中与父进程进行通信,使用一种有限的协议。
在查看了Pypy自带的pypy/pypy/translator/sandbox/sandlib.py
源代码后,我发现里面有一个叫VirtualizedSocketProc
的东西,它允许通过os.open
来打开套接字。我对代码做了一些修改(比如,允许在有限的端口上进行TCP连接),但整体改动不大。不过,我无法真正导入Pypy的socket
模块,因为它需要一个不存在的_socket
模块,而这个模块似乎是在解释器级别的代码中。
我想做的事情可行吗?如果可以,我该怎么导入socket模块?如果不行,我还有什么其他办法?
1 个回答
4
我进一步调查了一下,发现这是一个相当根本性的问题。socket
模块是在库层面实现的(在lib
目录里),它实际上只是一个空壳,真正的功能是在pypy/module
目录下的_socket
库中定义的。对于不太了解PyPy的人来说,可以简单理解为有两种类型的模块可以被导入,大致对应于CPython中的纯Python模块和C语言库。库层面实现的模块可以很容易地包含在沙箱中,实际上它们已经包含在“默认”的pypy_interact
沙箱里。然而,在解释器层面编写的模块在沙箱内部是无法使用的。
看起来我的方法根本上是有问题的,因为这个关键的区别。因此,如果你遇到同样的问题,还有几个其他的选择可以考虑:
- 直接使用
os.open
,并且文件名以tcp://
开头。这种方法效果很好,也是我比较喜欢的方式。 - 自己实现一个
socket
库。这当然不是最理想的选择,但我相信可以创建一个相对简单的socket库,像上面那样与沙箱控制器进行通信,封装socket功能。甚至可能可以修改默认的socket库来实现这一点(例如,不包含_socket
)。