交互式学习平台 · 直观对比安全与不安全编码的实际效果
在下方输入框中输入任意文本或 HTML/JavaScript 代码,观察不安全渲染与安全渲染的差异。
textContent 替代 innerHTML 是最简单有效的 XSS 防御手段。
如果必须渲染富文本,请使用 DOMPurify.sanitize() 进行过滤。
| 高危 API | 风险等级 | 安全替代方案 |
|---|---|---|
element.innerHTML = str | 高危 | element.textContent = str |
element.outerHTML = str | 高危 | element.insertAdjacentText() |
document.write(str) | 高危 | document.createTextNode() |
insertAdjacentHTML() | 中危 | insertAdjacentText() |
eval(str) / new Function(str) | 高危 | 避免使用,用 JSON.parse 替代 |
elem.setAttribute('onclick', str) | 高危 | elem.addEventListener('click', fn) |
点击下方按钮,通过内联脚本执行测试来演示 CSP 如何阻止恶意脚本执行。
<meta http-equiv="Content-Security-Policy"> 模拟 CSP 效果。
生产环境应始终在服务端响应头中设置 CSP,而非仅依赖 <meta> 标签。
| 指令 | 控制范围 | 开发注意事项 |
|---|---|---|
default-src | 所有资源的兜底来源 | 建议始终设置 |
script-src | JavaScript 脚本来源 | 避免 unsafe-inline,优先 nonce |
style-src | CSS 样式来源 | 评估是否允许 unsafe-inline |
img-src | 图片来源 | 包含 data: 支持 base64 图片 |
connect-src | fetch/XHR/WebSocket 目标 | 严格限制 API 端点 |
frame-ancestors | 是否允许被 iframe 嵌入 | 防点击劫持的关键指令 |
base-uri | <base> 标签允许的 URL | 限制防 base 标签劫持 |
form-action | 表单提交目标 URL | 限制防表单劫持 |
下方模拟了一个攻击者页面:透明 iframe 覆盖在伪造界面之上,用户以为自己点击的是"领取优惠券",实际点击的是隐藏的"确认转账"按钮。
X-Frame-Options: DENY(兼容旧浏览器)+ CSP frame-ancestors 'self'(精准控制)+ Frameguard 脚本(前端兜底)。
输入一个 URL 查看其安全头部配置情况,或了解各安全头部的推荐配置值。
| 安全头部 | 状态 | 当前值 / 推荐值 | 说明 |
|---|---|---|---|
| 输入 URL 或点击"查看示例数据"开始检测 | |||