Trusted Types 不能消除 eval 风险,它完全不拦截 eval、Function 构造函数或 setTimeout/setInterval 的函数形式调用;真正禁止 eval 的是 CSP 的 script-src 指令,需结合 ESLint 规则、CI 扫描与沙箱 iframe 实现多层防护。

Trusted Types 不能消除 eval 风险,它根本不管 eval。
Trusted Types 对 eval 完全无感知
Trusted Types 是浏览器原生的 DOM 操作防护机制,只拦截特定的「危险 sink」:比如 innerHTML、document.write、setTimeout(字符串形式)、setInterval(字符串形式)、location.href 赋值等。它不检查、不拦截、不重写 eval、Function 构造函数或 setTimeout 的函数形式调用。
哪怕你已启用 Trusted Types 并配置了 strict policy,下面这行代码依然能照常执行并触发 RCE:
eval("alert(document.cookie)")
浏览器不会抛出任何 Trusted Types 错误,控制台也不会警告——因为 eval 不在它的管辖范围。
为什么有人误以为 Trusted Types 能防 eval
混淆通常来自两类场景:
- 把
setTimeout("恶意代码", 100)当作eval类似行为——其实它属于 Trusted Types 的拦截列表,会被 block,但换成setTimeout(() => { ... }, 100)或eval(...)就完全绕过 - 项目中同时启用了 CSP(Content Security Policy)和 Trusted Types,而真正拦住
eval的其实是unsafe-eval这个 CSP 指令,不是 Trusted Types
CSP 的 unsafe-eval 才是 eval 的实际闸门
要真正禁止 eval 及其等价物(Function 构造函数、setTimeout/setInterval 字符串参数),必须靠 CSP:
Content-Security-Policy: script-src 'self' 'unsafe-eval'
→ 允许 eval
Content-Security-Policy: script-src 'self'
→ 禁止所有 eval 类操作(现代浏览器中默认生效,无需显式声明 unsafe-eval)
注意:Function 构造函数在 Chrome/Firefox 中同样被 script-src 控制;但 Safari 直到 2026 年仍存在部分绕过可能,需额外校验。
真正“彻底消除 eval 风险”的实操路径
不存在一招封禁的银弹。可靠方案是三层叠加:
- 强制启用 CSP(不含
unsafe-eval),并在 CI 中用check-csp工具扫描 HTML/JS 中硬编码的eval调用 - 用 ESLint 规则
no-eval+no-implied-eval在开发阶段报错,配合eslint-plugin-security检测new Function和危险字符串拼接 - 对遗留系统中无法删除的
eval(如某些老版图表库),用沙箱 iframe 隔离执行环境,并禁用其parent访问权限
Trusted Types 在这套体系里只负责 DOM 层——它防不住 eval,但能防止 eval 生成的恶意 HTML 被直接写入页面。两者职责完全不同,混用反而会掩盖真实风险点。

















