• Data Governance Dev's avatar
    feat(web3): 沙箱 import 白名单扩到常用纯计算类库(json/unicodedata/collections/dataclass 等) · c0bdbc92
    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.84s
    c0bdbc92
ai_rule.py 11.7 KB