XSS 学习笔记
基于 PayloadsAllTheThings、OWASP、MDN,把 XSS 攻击面和防护检查整理成实践清单。
测试方法
- 先确认输出上下文:HTML text、attribute、URL、JavaScript string、CSS、DOM sink、iframe wrapper。
- 逐个粘贴对应 payload,记录是否执行以及由哪条策略阻止。
- 同时测试管理员控制台、通知、邮件、日志、预览等延迟渲染 surface。
容易遗漏的攻击面
仅移除 script 不够,还要检查 event handler、SVG onload、引号逃逸。
href/src/action/data 需在解码规范化后做 protocol allowlist。
location、hash、postMessage 进入 innerHTML 等 API 会形成 DOM XSS。
不要只看存储格式,应 sanitize 最终 HTML。
需要 host/protocol allowlist、sandbox、allow 属性与 referrer policy。
SVG/HTML 上传和管理员审核页是延迟存储型 XSS 常见 surface。
防护清单
- 按输出上下文编码,只在确实需要 HTML 的地方使用可信 sanitizer。
- URL 先规范化,再校验 protocol/host allowlist。
- 用 textContent、setAttribute、createElement 替代危险 DOM sink。
- 按产品功能记录并测试 DOMPurify 的标签、属性、URL 策略。
- iframe 只允许必要 host,并采用保守 sandbox。
- CSP 是安全网,不应替代 sanitize。
希望讨论的真实问题
ProseMirror 内容由独立 renderer 展示并使用 DOMPurify 后,仍需面对多 provider iframe embed 是否能长期靠 host allowlist 管理的问题。
profile 字段看似很小,但进入 attribute 或 custom renderer 后会把 stored XSS 扩散到评论、通知和管理员列表。