feat(web3): 沙箱 import 白名单扩到常用纯计算类库(json/unicodedata/collections/dataclass 等)
用户反馈:AI 生成 JSON 校验函数,运行时报 ImportError: 'json' is not allowed。
原白名单只有 6 个模块(datetime/time/math/decimal/re/_strptime),太窄。
设计准则:「只能改内存里的 Python 对象,不能碰进程外的东西」——
纯计算 / 数据结构类库一律放;I/O、网络、进程、动态执行类一律不放。
白名单(31 个):
数据 / 时间 : datetime, time
数学 / 数值 : math, decimal, fractions, statistics, numbers, operator
字符串 / 编码: re, string, unicodedata, html
数据结构 : collections, collections.abc, itertools, functools
序列化 / 二进制: json, csv, struct, array
编码 / 哈希 : hashlib, base64, binascii
实用工具 : uuid, enum, dataclasses, typing, difflib
其他 : copy, pprint, reprlib, ipaddress
故意不放:os/sys/pathlib/subprocess/pickle/ctypes/importlib/socket/...
连 urllib.parse 也不放(import urllib 后 urllib.request 属性访问能拿到,副作用太大)。
沙箱三件套(踩坑):
1. builtin 白名单加 __build_class__ —— class X: / enum.Enum / @dataclasses.dataclass 都靠它;
动态 type('X', (), {}) 走 type.__call__ 不经过它,所以风险 ≈ 0
2. namespace 预填 __name__ / __qualname__ —— enum/dataclass metaclass 会查
3. __name__ 必须用 '__main__' 不能用假名 —— dataclasses._is_type 内部
sys.modules.get(cls.__module__).__dict__,假名返 None 然后 .__dict__ 报错
另:
- ai_rule.py 的 number / date / string prompt 都加上「沙箱已预注入的常用模块」清单
- RuleModal.vue 的 string rule 提示区也列已预注入模块清单
- test_rule_runner.py 新增 TestSandboxImports 类,46 个用例
(26 个模块 smoke + 3 个 import 形式 + 16 个危险模块被拦 + 1 个 urllib 被拦)
验证:
python -m pytest web3/tests/ → 123 passed, 3 warnings
npx vite build → ✓ built in 6.84s
Showing
Please register or sign in to comment