RestrictedPython 是 Python 语言的一个定义子集,它允许将程序输入提供到受信任的环境中。
项目描述
受限Python
RestrictedPython 是一个帮助定义 Python 语言子集的工具,它允许将程序输入提供到受信任的环境中。RestrictedPython 不是沙盒系统或安全环境,但它有助于定义可信环境并在其中执行不受信任的代码。
有关完整文档,请参阅http://restrictedpython.readthedocs.io/。
例子
为了基本了解 RestrictedPython 在这里做了两个例子:
一个没有问题的代码示例
Python 允许您执行大量命令。这不会损害任何系统。
>>> from RestrictedPython import compile_restricted
>>> from RestrictedPython import safe_globals
>>>
>>> source_code = """
... def example():
... return 'Hello World!'
... """
>>>
>>> loc = {}
>>> byte_code = compile_restricted(source_code, '<inline>', 'exec')
>>> exec(byte_code, safe_globals, loc)
>>>
>>> loc['example']()
'Hello World!'
有问题的代码示例
这个直接在 Python 中执行的示例可能会损害您的系统。
>>> from RestrictedPython import compile_restricted
>>> from RestrictedPython import safe_globals
>>>
>>> source_code = """
... import os
...
... os.listdir('/')
... """
>>> byte_code = compile_restricted(source_code, '<inline>', 'exec')
>>> exec(byte_code, safe_globals, {})
Traceback (most recent call last):
ImportError: __import__ not found
变化
5.2 (2021-11-19)
记录需要__name__来定义类。
添加对 Python 3.10 的支持。审核 Python 3.10 更改日志并没有发现任何需要在 RestrictedPython 中进行操作的更改。
使用 Python 3.8+ 时避免出现弃用警告。(#192)
5.1 (2020-10-07)
特征
添加对(Python 3.8+)赋值表达式的支持(即:=运算符)
在检查该版本中所做的语法更改的安全含义后,添加对 Python 3.9 的支持。
添加对字节和排序内置函数的支持(#186)
文档
修复
5.0 (2019-09-03)
重大变化
从 4.0 开始,恢复...(省略号)语句的容差。不需要支持 Python 3.8。省略号声明的安全含义并非 100% 明确且未经检查。...(省略号)再次被禁止。
特征
在 Python 3.6+ 中添加对 f 字符串的支持。(#123)
4.0 (2019-05-10)
自 3.6.0 以来的变化:
重大变化
compile_restricted*函数现在返回一个 namedtuple CompileResult而不是一个简单的tuple。
删除版本 3.x 的旧实现:RCompile.py、 SelectCompiler.py、MutatingWorker.py、RestrictionMutator.py和 tests/verify.py。
放弃对长期弃用的集合模块的支持。
特征
大部分基于 Python AST 模块完全重写。[loechel (Alexander Loechel)、icemac (Michael Howitz)、stephan-hof (Stephan Hofmockel)、tlotze (Thomas Lotze)]
添加对 Python 3.5、3.6、3.7 的支持。
添加对 Python 3.8 的初步支持。从 3.8.0a3 开始发布。
使用除 CPython 之外的其他 Python 实现时发出警告,因为将 RestrictedPython 与除 CPyton 之外的其他版本一起使用是不安全的。有关 PyPy,请参阅https://bitbucket.org/pypy/pypy/issues/2653。
允许...(省略号)语句。它需要支持 Python 3.8。
允许yield和yield from语句。生成器函数现在可以在 RestrictedPython 中工作。
允许在类上定义以下魔术方法。( #104 ) 它们不能直接调用,而是通过内置的方式使用它们(例如类实例化或比较):
__在里面__
__包含__
__lt__
__le__
__eq__
__ne__
__gt__
__ge__
现在禁止从 import *(所谓的星号导入)等导入,因为它们允许导入以下划线开头的名称,这可能会覆盖受保护的内置插件。(#102)
允许在RestrictionCapableEval.eval()的默认实现中使用列表推导 。
切换到 pytest 作为测试运行器。
将测试覆盖率提高到 100%。
Bug修复
改进.Guards.safer_getattr以防止访问以下划线开头的名称。(#142)
3.6.0 (2010-07-09)
使用from x import y格式为导入期间分配的名称添加名称检查 。
在 Python 2.7 中使用多上下文 和语句分配别名时添加名称检查测试。
在 Python 2.7 中添加测试以保护 dict 和 set 理解的迭代器。
3.6.0a1 (2010-06-05)
删除对DocumentTemplate.sequence的支持- 这是在 DocumentTemplate 包本身中处理的。
3.5.2 (2010-04-30)
删除对zope.testing的测试依赖。
3.5.1 (2009-03-17)
为实用程序模块添加测试。
导入 Python 的sets模块时过滤 DeprecationWarnings 。
3.5.0 (2009-02-09)
放弃对 Python 2.1 / 2.2 的旧版支持(嵌套范围/生成器的__future__导入。)。
3.4.3 (2008-10-26)
修复弃用警告:with现在是 Python 2.6 上的保留关键字。这意味着 RestrictedPython 现在应该在 Python 2.6 上运行。感谢 GSoC 学生 Ranjith Kannikara 提供的补丁。
为三元 if 表达式和关键字和上下文管理器添加测试。
3.4.2 (2007-07-28)
将主页 URL 更改为 PyPI 站点
改进README.txt。
3.4.1 (2007-06-23)
修复http://www.zope.org/Collectors/Zope/2295:Zope 2 PythonScript 中的裸条件后跟注释会导致 SyntaxError。
3.4.0 (2007-06-04)
RestrictedPython 现在有自己的发布周期作为一个单独的项目。
与 Zope 2 树中的 RestrictedPython 同步。
3.2.0 (2006-01-05)
对应于作为 Zope 3.2.0 版本的一部分发布的 RestrictedPython 包的版本。
与 3.1.0 相比没有变化。
3.1.0 (2005-10-03)
对应于作为 Zope 3.1.0 版本的一部分提供的 RestrictedPython 包的版本。
删除未使用的化石模块SafeMapping。
将弃用的whrandom模块替换为random(别名为whrandom以实现向后兼容性)。
3.0.0 (2004-11-07)
对应于作为 Zope X3.0.0 版本的一部分提供的 RestrictedPython 包的版本。