Trusted Types 安全浏览 - DOM XSS防护演示
展示如何用默认策略将字符串转换为TrustedHTML,并观察禁止直接赋值的安全限制。
UD5工具箱
理解浏览器如何通过 Trusted Types 防止 DOM-based XSS 攻击
innerHTML 直接赋值):
policy.createHTML()):
const sanitizer = trustedTypes.createPolicy('my-policy', {
createHTML: (input) => {
// 使用 DOMPurify 或自定义清理逻辑
return DOMPurify.sanitize(input, {
ALLOWED_TAGS: ['b','i','em','strong','a','p','br','ul','ol','li','span','div','h1','h2','h3','h4','h5','h6','img','table','tr','td','th','thead','tbody'],
ALLOWED_ATTR: ['href','target','src','alt','class','id','style']
});
},
createScript: (input) => {
// 仅允许通过哈希验证的已知安全脚本
throw new Error('动态脚本被阻止');
},
createScriptURL: (input) => {
// 仅允许白名单域名
const url = new URL(input, location.origin);
if (['cdn.example.com','static.example.com'].includes(url.hostname)) {
return input;
}
throw new Error('不可信的脚本URL');
}
});
// ✅ 安全:通过策略创建 TrustedHTML el.innerHTML = sanitizer.createHTML(userInput); // ✅ 安全:使用 TrustedScriptURL scriptEl.src = sanitizer.createScriptURL(url); // ❌ 错误:直接赋值字符串会被浏览器拒绝 el.innerHTML = userInput; // TypeError!
Content-Security-Policy: trusted-types my-policy; Content-Security-Policy: require-trusted-types-for 'script';
Element.innerHTML 受保护Element.outerHTML 受保护Document.write / writeln 受保护DOMParser.parseFromString 受保护Range.createContextualFragment 受保护HTMLIFrameElement.srcdoc 受保护script.src 受保护script.textContent 受保护EmbedElement.src 受保护ObjectElement.data 受保护| 浏览器 | 版本 | 支持状态 |
|---|---|---|
| Chrome | 83+ | 完全支持 |
| Edge | 83+ | 完全支持 |
| Firefox | - | 开发中 |
| Safari | - | 暂不支持 |
| Opera | 69+ | 完全支持 |
innerHTML、document.write)只接受经过策略处理的可信对象,从而从根源上防止 DOM-based XSS 攻击。它要求开发者为所有注入点提供经过验证的"可信类型"数据,而非原始字符串。这是防御深度策略的关键一环,能阻止绝大多数基于 DOM 的跨站脚本攻击。
innerHTML、eval、document.write),不经过服务端。Trusted Types 主要针对 DOM XSS,通过锁定危险的 DOM sink 来阻止攻击。
require-trusted-types-for 'script' 和 trusted-types <policy-name>;2) 在 JavaScript 中创建 Trusted Types 策略,使用 trustedTypes.createPolicy() 定义清理规则。推荐搭配 DOMPurify 等库实现 createHTML 策略。
Content-Security-Policy-Report-Only。同时利用默认策略(default policy)作为过渡,逐步将代码中的字符串赋值迁移到策略调用。Chrome DevTools 也能帮助识别违规点。
<img src=x onerror=alert(1)> — 利用事件处理器<script>alert(1)</script> — 直接注入脚本标签<a href="javascript:alert(1)">click</a> — javascript: 协议<div onmouseover="..."> — 事件属性注入eval(userInput) — 代码执行函数createHTML 的实现。三者协同工作:CSP 启用 Trusted Types 强制执行 → Trusted Types 策略调用 DOMPurify 清理 → 安全内容注入 DOM,形成完整的防御链条。
展示如何用默认策略将字符串转换为TrustedHTML,并观察禁止直接赋值的安全限制。
使用新的Sanitizer API清理可能存在XSS风险的HTML字符串,并安全插入DOM。
观察目标节点的添加、删除、属性变更,日志可视化展示,调试动态DOM的利器。
可视化CSS box-shadow生成工具,拖拽调整阴影偏移、模糊、扩散、颜色,实时预览并生成代码。
在线Flexbox布局可视化生成器,直观调整主轴、交叉轴对齐、换行等属性,实时显示效果并输出CSS。
粘贴package.json内容,调用公开漏洞API(演示数据)检查依赖安全性,警示高危包。
使用范围请求安全地检查密码是否出现在已知数据泄露库中(不发送完整密码)。
使用浏览器SubtleCrypto API实现AES-GCM或AES-CBC加密解密,可设密码短语,全前端安全。
编写 lit-html 模板和数据,即时渲染结果,帮助学习 Lit 框架。
在隔离的模拟环境中输入 SQLi 载荷,展示注入前后 SQL 语句变化,纯粹用于教学。
提供多组在各色盲类型下仍可区分的定性、连续配色方案,辅助图表设计。
为图片添加凸变或凹变扭曲,模拟超广角鱼眼镜头的夸张效果。
粘贴 Mustache 模板与数据 JSON,所见即所得地渲染输出,支持节段和反转节段。
编写 Babel 插件代码,输入源代码,实时查看转换后的结果,加速插件开发。
解析JSON Web Token,显示Header和Payload内容及签名算法,不验证签名,方便开发调试。
展示 WebGPU 的网格和任务着色器如何代替传统顶点处理管线。
填入Payload及密钥,选择HS256/RS256算法生成JWT,并验证已签发Token的签名与过期时间。
在线XML格式化工具,支持XML缩进美化、语法高亮、树形结构查看及格式验证,完全在浏览器中处理。
在支持手部追踪的 XR 设备上,展示裸手交互的 VR/AR 体验。
提供模块图,编写 Rollup 插件并观察其对打包过程的影响。
选择数据类型(Article, Product 等)并填写属性,自动生成对应的 JSON-LD 结构化数据代码。
在线JSON格式化与验证工具,支持JSON压缩美化、语法高亮、错误定位,浏览器本地处理保障数据安全。
生成一个随机字符矩阵的密码卡,通过行列坐标记忆组合强密码,可打印保存。
输入鱼缸净水量和药物推荐浓度,计算需要加入的毫升或克数,避免用药过量。
输入包含隐私信息的文本,一键将手机号、身份证等部分遮盖。
列出三角牌、灭火器、急救包等推荐物品,勾选检查到期日。
显示人体正面与背面脆弱点,点击显示简单有效的击打与解脱方法。
展示常见野生菌外观特征对比,标注可食与剧毒区别,附中毒症状。
输入药片上的字母数字、颜色及形状,从常用药品库中匹配可能品种,辅助用药安全。
生成一次性恢复码,排列成卡片样式可打印保存,用于账号恢复。