news 2026/4/18 13:15:55

从头说下DOM XSS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从头说下DOM XSS

Demo此问题

1. 写个html 叫test.html吧

<!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>DOM XSS test:test.html</title> </head> <body> <h1>DOM XSS test:test.html</h1> <div id="app"></div> <script> const params = new URLSearchParams(location.search); const msg = params.get('msg') || 'hello'; console.log('msg =', msg); // ← 自检:确认读到 < ...> document.getElementById('app').innerHTML = `<p>${msg}</p>`; </script> </body> </html>

2 powershell 启动web

python -m http.server 8000

3 浏览器访问 localhost:8000/test.html?msg=<img%20src=x%20οnerrοr=alert(1)>

4 看到个弹窗

原因

它直接将用户可控的 URL 参数(msg)拼接到 innerHTML,未做任何转义或过滤。攻击者可以通过构造恶意的 msg 参数注入 JavaScript 代码,从而执行任意脚本。

运行中debug所见

修复方式

1. 输入验证与输出编码

  • 输入验证:对来自location,document.URL,document.referrer,window.name等的值进行严格校验,只允许预期格式(如数字、固定字符串)。
  • 输出编码:在插入 HTML 时使用合适的编码:
    • HTML 内容 →textContentinnerText
    • 属性值 →setAttribute()
    • URL → 使用encodeURIComponent()

2. 避免危险的 DOM API

  • 禁止使用
    • innerHTML,outerHTML,document.write()
  • 替代方案
    • 使用textContentcreateElement()+appendChild()来构建安全 DOM。
<script> const params = new URLSearchParams(location.search); const msg = params.get('msg') || 'hello'; const mode = (params.get('mode') || 'text').toLowerCase(); const app = document.getElementById('app'); // 方案 1:纯文本渲染(默认) function renderText(s){ const p = document.createElement('p'); p.textContent = s; // ✅ 不解析为 HTML app.replaceChildren(p); } // 方案 2:白名单消毒(示例实现,生产用成熟库更好) function renderSanitized(html){ const allowedTags = new Set(['b','i','em','strong','u','a','code','pre','br']); const allowedAttrs = { 'a': new Set(['href','title']) }; const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const fragment = document.createDocumentFragment(); const walk = (node, outParent) => { if (node.nodeType === Node.TEXT_NODE) { outParent.appendChild(node.cloneNode()); return; } if (node.nodeType === Node.ELEMENT_NODE) { const tag = node.tagName.toLowerCase(); if (!allowedTags.has(tag)) { Array.from(node.childNodes).forEach(child => walk(child, outParent)); // 剥离不安全标签,仅保留文本/安全子节点 return; } const el = document.createElement(tag); for (const attr of Array.from(node.attributes)) { const name = attr.name.toLowerCase(), value = attr.value; if (name.startsWith('on')) continue; // 禁止事件属性 const allowSet = allowedAttrs[tag]; if (allowSet && !allowSet.has(name)) continue; if (tag === 'a' && name === 'href') { try { const u = new URL(value, location.origin); if (!['http:', 'https:', 'mailto:'].includes(u.protocol.toLowerCase())) continue; // 禁止 javascript:/data:/file:/vbscript: } catch (e) { continue; } } el.setAttribute(name, value); } Array.from(node.childNodes).forEach(child => walk(child, el)); outParent.appendChild(el); } }; Array.from(doc.body.childNodes).forEach(n => walk(n, fragment)); app.replaceChildren(fragment); } if (mode === 'sanitize') renderSanitized(msg); else renderText(msg); </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:03:26

如何用VSCode快捷键加速量子算法开发?80%的人都忽略了第3个

第一章&#xff1a;VSCode量子开发快捷键的核心价值 在量子计算快速发展的今天&#xff0c;开发者对高效编程工具的需求日益增长。Visual Studio Code&#xff08;VSCode&#xff09;凭借其高度可定制性与丰富的插件生态&#xff0c;已成为量子软件开发的首选编辑器之一。掌握其…

作者头像 李华
网站建设 2026/4/18 4:04:56

如何定制Cirq代码补全?掌握这3个高级技巧提升开发效率

第一章&#xff1a;Cirq代码补全的核心机制解析Cirq 是 Google 开发的用于编写、模拟和执行量子电路的 Python 框架。其代码补全机制依赖于 Python 的类型注解与现代 IDE 的静态分析能力&#xff0c;结合 Cirq 自身清晰的类结构设计&#xff0c;实现高效智能提示。类型注解驱动…

作者头像 李华
网站建设 2026/4/18 4:02:15

移动优先设计:重塑Flexbox Froggy的移动学习体验

移动优先设计&#xff1a;重塑Flexbox Froggy的移动学习体验 【免费下载链接】flexboxfroggy A game for learning CSS flexbox &#x1f438; 项目地址: https://gitcode.com/gh_mirrors/fl/flexboxfroggy 你有没有试过在通勤路上学习CSS Flexbox&#xff1f;当手机屏幕…

作者头像 李华
网站建设 2026/4/18 4:05:00

Docker安全防线第一环,Scout漏洞详情导出全解析(附脚本模板)

第一章&#xff1a;Docker安全防线第一环&#xff0c;Scout漏洞详情导出全解析&#xff08;附脚本模板&#xff09;在容器化部署日益普及的今天&#xff0c;保障镜像安全成为DevSecOps流程中的关键一环。Docker Scout 作为 Docker 官方推出的漏洞分析工具&#xff0c;能够自动扫…

作者头像 李华
网站建设 2026/4/18 4:02:08

紧急警告:Q#-Python混合项目中这4类隐藏bug正在拖垮你的量子算法

第一章&#xff1a;Q#-Python混合项目中的调试困境在构建量子计算应用时&#xff0c;Q# 与 Python 的协同工作模式为开发者提供了强大的表达能力。然而&#xff0c;这种跨语言集成也带来了显著的调试挑战&#xff0c;尤其是在运行时错误定位、变量状态追踪以及异构环境日志输出…

作者头像 李华
网站建设 2026/4/18 4:03:29

rclone云存储同步完全指南:轻松实现跨平台数据管理

rclone云存储同步完全指南&#xff1a;轻松实现跨平台数据管理 【免费下载链接】rclone 项目地址: https://gitcode.com/gh_mirrors/rcl/rclone 还在为不同云存储平台之间的文件同步而烦恼吗&#xff1f;今天我要向你介绍一款云存储同步神器——rclone&#xff0c;它能…

作者头像 李华