首页/安全/漏洞与攻击面速查/代码与表达式注入(eval 类风险)
Web 漏洞原理与防护55 条

代码与表达式注入(eval 类风险)

eval、exec、动态 import、正则求值等能力若接受用户输入,等同于把代码执行权交给输入;规则引擎与低代码平台尤其要警惕表达式求值成为注入面。

漏洞与攻击面速查安全更新于 2026-10-13

代码与表达式注入

这类问题指程序把外部输入当作代码或表达式求值:Python 的 eval 与 exec、JavaScript 的 eval 与 new Function、Java 的 ScriptEngine 与 SpEL、OGNL 表达式,本质相同。低代码平台、规则引擎、报表公式让用户自己写表达式,把风险推到业务人员也能触达的位置。判断标准始终是同一个:这个求值入口能否被外部输入影响。

基本信息

高风险能力Python 的 eval/exec/compile/pickle、JS 的 eval/new Function、Java 的 ScriptEngine/SpEL/OGNL
高发场景规则引擎、低代码公式、报表计算字段、动态路由与插件热加载
排查方式对求值关键字做全量检索,逐处确认输入来源
替代方案AST 白名单解释器、JSON 或 DSL 固定引擎、映射表
加固要求沙箱隔离、超时与内存限制、禁用网络与文件访问
留痕要求记录谁在何时修改了表达式或规则

语言与风险点

语言风险 API安全替代
Pythoneval、exec、compile、pickle用 ast.literal_eval 解析字面量,或 AST 白名单求值
JavaScripteval、new Function、字符串形式 setTimeoutJSON.parse 加显式函数调用
JavaScriptEngine、SpEL、OGNL固定规则引擎加白名单函数
PHPeval、字符串形式 assert、create_function映射表与匹配器,去掉动态求值
低代码平台自定义公式与脚本字段、插件热加载只提供受限公式语法与函数白名单

风险点排查清单

风险点排查清单
Python:eval / exec / compile / pickle
JavaScript:eval / new Function / setTimeout 字符串形式
Java:ScriptEngine、SpEL/OGNL 表达式
PHP:eval、assert 字符串形式、create_function
低代码平台:自定义公式与脚本字段、插件热加载
检索示例:grep -rn "eval(" --include=*.py . 逐处确认输入来源

安全替代思路

安全替代思路
公式计算:用 AST 白名单解释器,仅允许算术、比较与白名单函数
规则配置:用 JSON/DSL 交给固定引擎执行,不做字符串代码拼接
数据转换:用模板参数或映射表,不把数据解析为代码
必须执行脚本时:独立沙箱进程 + 超时与内存限制 + 无网络无文件权限

典型使用场景

  • 代码审计中的注入点定位与输入来源追溯
  • 新增规则引擎或公式功能时的设计评审
  • 低代码平台上架前确认能力边界与函数白名单
  • 渗透测试报告中代码注入类问题的整改举证
  • 应急时定位可疑表达式的来源与修改记录
  • 提交门禁中加入求值关键字的静态扫描
审计时对关键字做全量检索(如 grep -rn 'eval(' ),逐处确认输入来源;命中不等于漏洞,但每一处都需要能解释清楚。
把「沙箱执行用户脚本」当卖点但沙箱实现不严时,逃逸的后果等同于直接代码执行。这类能力上线前应单独做安全评审,并限制可调用的函数集合。

易错点

  • 把「沙箱执行用户脚本」当卖点但沙箱实现不严:逃逸后果等同于直接代码执行
  • 只拦关键字不控输入来源,拼接、编码与反射调用等写法照样命中求值
  • 沙箱不加超时与资源限制,一段死循环就能拖垮服务,可用性问题同样算事故
  • 低代码公式与报表字段不做函数白名单,用户可以直接调用系统函数
  • 排查只看应用代码,忽略规则引擎配置与数据库里保存的表达式

数据来源与参考

  • OWASP 注入类缺陷说明
  • Python 官方文档(eval 安全警告)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌