-
Data Governance Dev authored
用户反馈: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.84sc0bdbc92