Trusted Types安全演示 - 防止DOM XSS
展示如何通过强制Trusted Types策略阻止将未清理字符串直接赋给innerHTML。
UD5工具箱
element.innerHTML = input,未经过任何过滤
Trusted Types 策略 清理后插入
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types tt-demo-policy
report-uri /csp-report 来收集违规报告。
// 创建 Trusted Types 安全策略
const policy = trustedTypes.createPolicy('tt-demo-policy', {
createHTML: (input) => {
// 使用 DOMPurify 或自定义清理
return sanitizeHTML(input);
},
createScriptURL: (input) => {
// 验证URL来源
if (isTrustedOrigin(input)) return input;
throw new Error('Untrusted script URL');
}
});
// 安全使用
element.innerHTML = policy.createHTML(userInput);
createHTML 方法会对输入进行清理,移除事件处理器和危险标签,返回安全的 TrustedHTML 对象。
innerHTML、document.write、script.src 等)只能接受经过安全策略处理的"可信类型"对象,而非原始字符串。这强制开发者对用户输入进行清理和验证,将XSS防护从"选择性"变为"强制性"。Trusted Types 是 W3C 标准,由Google Chrome团队主导,目前已在Chrome 83+、Edge 83+中得到完整支持。
<img src=x onerror=alert(1)><a href="javascript:alert(1)">Trusted Types 通过限制这些注入点只接受可信对象,从而阻断攻击路径。
| 类型 | 用途 | 对应DOM操作 |
|---|---|---|
TrustedHTML | 安全的HTML片段 | innerHTML、outerHTML、insertAdjacentHTML |
TrustedScript | 安全的脚本内容 | eval()、script.textContent、Function() |
TrustedScriptURL | 安全的脚本URL | script.src、import()、Worker() |
在HTTP响应头中添加:
Content-Security-Policy: require-trusted-types-for 'script'限制允许的策略名称(可选但推荐):
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types myPolicy anotherPolicy添加违规报告端点:
Content-Security-Policy: require-trusted-types-for 'script'; report-uri /csp-violation-report-endpoint配置后,浏览器会拦截所有不安全的DOM操作并抛出TypeError,同时向报告端点发送违规信息。
trustedTypes.createPolicy('default', ...) 创建。当代码尝试使用字符串进行DOM操作时,浏览器会先尝试默认策略来转换。如果默认策略也失败或不存在,则抛出TypeError。
注意 默认策略应谨慎使用,因为它可能成为安全漏洞的后门。建议仅用于渐进式迁移期间,最终应移除默认策略并显式使用命名策略。
在不支持的浏览器中,建议使用 if (window.trustedTypes) 进行特性检测,并提供polyfill或降级方案。
使用以下JavaScript代码检测:
// 检测API是否存在
const apiAvailable = typeof window.trustedTypes !== 'undefined';
// 检测CSP是否强制启用(尝试赋值innerHTML)
let enforced = false;
try {
const el = document.createElement('div');
el.innerHTML = 'test';
} catch(e) {
if (e instanceof TypeError) enforced = true;
}
console.log('API可用:', apiAvailable, 'CSP强制:', enforced);如果CSP强制启用,对 innerHTML 赋字符串值会抛出TypeError异常。
Trusted Types 提供了强制机制,而DOMPurify提供了清理能力。两者是黄金搭档:
// 在Trusted Types策略中使用DOMPurify
const policy = trustedTypes.createPolicy('sanitize-html', {
createHTML: (input) => {
// DOMPurify返回清理后的安全字符串
return DOMPurify.sanitize(input, {
ALLOWED_TAGS: ['b','i','em','strong','a','p','br'],
ALLOWED_ATTR: ['href','title','target']
});
}
});策略的createHTML返回的字符串会自动被包装为TrustedHTML对象,从而满足浏览器的类型要求。
innerHTML、document.write、eval 的地方el.innerHTML = x 改为 el.innerHTML = policy.createHTML(x)Content-Security-Policy-Report-Only 收集违规但不阻断Content-Security-Policy 强制模式但Trusted Types可以与CSP、输入验证、输出编码等措施配合,构建纵深防御体系,显著降低XSS攻击面。它是现代Web安全防护的重要一环。
展示如何通过强制Trusted Types策略阻止将未清理字符串直接赋给innerHTML。
使用新的Sanitizer API清理可能存在XSS风险的HTML字符串,并安全插入DOM。
在线Flexbox布局可视化生成器,直观调整主轴、交叉轴对齐、换行等属性,实时显示效果并输出CSS。
使用范围请求安全地检查密码是否出现在已知数据泄露库中(不发送完整密码)。
提供多组在各色盲类型下仍可区分的定性、连续配色方案,辅助图表设计。
可视化CSS box-shadow生成工具,拖拽调整阴影偏移、模糊、扩散、颜色,实时预览并生成代码。
在线XML格式化工具,支持XML缩进美化、语法高亮、树形结构查看及格式验证,完全在浏览器中处理。
解析JSON Web Token,显示Header和Payload内容及签名算法,不验证签名,方便开发调试。
使用浏览器SubtleCrypto API实现AES-GCM或AES-CBC加密解密,可设密码短语,全前端安全。
粘贴package.json内容,调用公开漏洞API(演示数据)检查依赖安全性,警示高危包。
填入Payload及密钥,选择HS256/RS256算法生成JWT,并验证已签发Token的签名与过期时间。
掷五个虚拟骰子,自动分类计算十六条得分项并高亮最佳填充策略,辅助桌游。
填写标题、文本和URL,触发系统级分享菜单,测试Web Share API功能。
在线JSON格式化与验证工具,支持JSON压缩美化、语法高亮、错误定位,浏览器本地处理保障数据安全。
随时记录一句话或一张照片,日后随机抽出一张查看,带来惊喜。
观察目标节点的添加、删除、属性变更,日志可视化展示,调试动态DOM的利器。
输入部分代码,选择算法自动计算最后一位校验码,用于生成或验证条码。
输入目标URL,发送预检请求,分析Access-Control-*头,诊断跨域问题。
将非ASCII域名(如中文域名)转换为Punycode格式或还原,理解国际化域名编码机制。
掷5颗骰子,选择保留哪些,3次机会后填入计分表,自动加总。
输入域名,调用开放的WHOIS API获取注册信息,返回可用信息片段(需API兼容)。
输入 PlantUML 文本,编码为可嵌入图片的 URL 或解码已有的 PlantUML 链接查看源码。
在线Base64URL编码与解码,替换+/-为-/_并去除=填充,专为URL和JWT等场景优化。
在线ROT13编码与解码,字母位移13位,简单经典的单表置换加密,适用于隐藏轻度敏感文本。
解码 JWT 三部分,验证签名(若提供密钥),检查过期时间并高亮,支持修改负载重新生成。
使用新的 Navigation API 拦截导航、管理历史条目,构建类 SPA 体验。
随机生成或手动添加种子点,实时绘制泰森多边形分割区域,可导出为SVG或图片。
在线条形码生成工具,支持Code128、EAN-13等多种格式,输入数字或字母生成矢量条形码,可保存为图片。
显示若干张色盲测试图,用户识别数字,判断可能的色觉缺陷类型。
在Canvas上用鼠标涂抹刮开银色涂层,显示隐藏文字或图片,模拟刮刮乐。