告别 innerHTML,迎接 setHTML:Firefox 148 XSS 保护 🛡️
来源: Mozilla Hacks | 评分:
XSS
Security
Firefox
Web Security
Sanitizer API
XSS:十年之久的 Web 安全噩梦
跨站脚本攻击 (XSS) 是 Web 上最普遍的安全漏洞之一。近十年来,它一直是 CWE-79,位列三大 Web 漏洞之中。
⚠️ XSS 危害:攻击者可以监控和操纵用户交互,持续窃取用户数据,漏洞存在多久就能偷多久。
现有方案的局限
Mozilla 从 2009 年开始牵头制定 Content-Security-Policy (CSP) 标准。尽管不断改进,但 CSP 未获得足够采用,无法保护长尾 Web 站点,因为它需要:
- 对现有网站进行重大架构更改
- 安全专家持续审查
Sanitizer API:标准化解决方案
Sanitizer API 提供了一种标准化的方法,将恶意 HTML 转换为无害 HTML。Firefox 148 是首个实现这一标准化安全增强 API 的浏览器!
使用 setHTML() 替代 innerHTML
// 之前 (不安全)
element.innerHTML = userInput;
// 现在 (安全)
element.setHTML(userInput);
自动净化示例
// 输入
document.body.setHTML(`<h1>Hello my name is <img src="x" onclick="alert('XSS')">`);
// 输出 (安全的)
<h1>Hello my name is</h1>
危险的 onclick 属性被自动移除!
自定义配置
如果默认配置太严格或太宽松,开发者可以提供自定义配置:
const sanitizer = new Sanitizer({
elements: ['div', 'span', 'p'],
attributes: {'*': ['class']}
});
element.setHTML(userInput, { sanitizer });
结合 Trusted Types 使用
更强的保护可以结合 Trusted Types:
- 集中控制 HTML 解析和注入
- 允许 setHTML() 同时阻止其他不安全的 HTML 插入方法
- 帮助防止未来的 XSS 回滚
为什么这很重要
- 零代码修改:只需将 innerHTML 替换为 setHTML()
- 默认安全:内置净化,无需安全团队
- 标准化:跨浏览器兼容
- Firefox 领先:其他浏览器即将跟进
总结
Sanitizer API 是 Web 安全的重大进步。它让所有开发者都能轻松防止 XSS 攻击,无需专门的安全团队或复杂的实施更改。
🕐 最后更新: 2026-03-18 | 来源: Mozilla Hacks