python - 为什么 BuiltinImporter.create_module 只恢复部分内置模块?
问题描述
我正在挑战以证明这一点,即使他们无法访问任何内置函数,eval
也很危险。exec
挑战是这样的:
vars(__builtins__).clear()
del __builtins__
... # your code here
print('you win') # if this line doesn't crash, you win
我想出了一些疯狂的代码,可以访问残缺的builtins
模块并重新导入它以恢复其功能。这是我用来通过挑战的代码(在 CPython 3.7 中测试):
type = ''.__class__.__class__
ABCMeta = type.__subclasses__(type)[0]
abc_globals = ABCMeta.register.__globals__
importlib_globals = abc_globals['__loader__'].get_data.__globals__
sys = importlib_globals['sys']
__builtins__ = sys.modules['builtins']
loader = sys.modules['_frozen_importlib'].BuiltinImporter
spec = sys.modules['_frozen_importlib'].ModuleSpec('builtins', loader)
loader.create_module(spec)
loader.exec_module(__builtins__)
__builtins__.__spec__ = spec
但通过挑战后,我注意到一些内置函数和类仍然缺失:
>>> print
<built-in function print>
>>> int
<class 'int'>
>>> exit
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'exit' is not defined
>>> KeyError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'KeyError' is not defined
为什么是这样?为什么BuiltinImporter.create_module(...)
恢复了int
andprint
而不是exit
and KeyError
?
解决方案
推荐阅读
- php - Woocommerce 设置发货方式,获取运费
- python - Python海龟bgpic瞬间消失
- c - cuda和矩阵运算中的Grid-Stride Loop,我们为什么需要它?
- sql - 显示日期是工作日还是周末的 SQL Server 过程
- react-native - 与 Redux 一起使用的 React-Native 最佳导航解决方案
- c++ - 使用 Sublime Text 3 在 Powershell 中构建 C++ 而不是 CMD
- html - 防止两个引导容器相互重叠。?
- javascript - 为什么有些函数需要在函数名之前声明“函数”?
- php - 在其他页面 PHP MySql 中获取会话数据
- java - RecyclerView 中的网格项未正确显示