DOM型XSS入口点需追踪用户输入源(如location.search、location.hash)到危险接收器(如innerHTML、document.write)的数据流,全程未经安全处理即构成漏洞。

HTML本身不执行逻辑,但它是所有Web攻击的“落地层”——XSS、点击劫持、信息泄露、跳转钓鱼等漏洞,几乎都靠HTML结构或其承载的数据触发。排查不是靠扫一遍标签,而是盯住「用户输入如何进、如何出、中间有没有被信任」这根主线。
怎么找 DOM 型 XSS 的入口点
DOM 型 XSS 完全在前端发生,服务器返回的 HTML 看似干净,但 JS 脚本一运行就中招。关键不是看 <script> 标签,而是找那些把用户输入直接塞进危险 API 的地方。
- 先搜前端 JS 里常见的数据源:
location.search、location.hash、document.referrer、localStorage.getItem()、URLSearchParams - 再定位 sink(接收器):
innerHTML、outerHTML、document.write()、eval()、setTimeout()、location.href、<img>或<a>的src/href属性 - 用浏览器 Console 模拟输入,比如
location.search = "?q=%3Cimg%20src=x%20onerror=alert(1)%3E",然后单步调试 JS,看 payload 是否未经处理就进了innerHTML
如何检查图片和多媒体标签的 src 漏洞
<img src> 和 <video src> 看似安全,但只要 src 值来自用户输入且没过滤,就可能变成 XSS 或 SSRF 入口。重点不是标签本身,而是它背后的动态拼接逻辑。
- 检查所有
img.src = userInput、video.setAttribute('src', userInput)这类赋值语句,尤其注意是否校验协议 —— 必须拒绝javascript:、data:(除非业务强需且已净化)、vbscript: - 如果后端返回 JSON 包含图片 URL,前端直接
img.src = data.avatar,那就要确认后端是否对 URL 做了白名单校验(只允许https://+ 可信域名) - 上传头像类功能,别信前端 JS 判断文件类型;浏览器可绕过
accept="image/*",必须服务端校验 MIME 类型和文件头
表单提交时哪些地方容易漏掉后端防护
前端 <form> 的 action 和字段看似可控,但真正漏洞常藏在后端对这些字段的“无感信任”里。手动改请求、删掉 JS 验证、用 curl 直连接口,就能暴露问题。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
立即学习“前端免费学习笔记(深入)”;
- 所有表单字段,包括隐藏域(
<input type="hidden" name="price" value="99">),后端必须重新校验合法性 —— 价格不能被前端篡改为负数或超大值,ID 不能被改成别人的 - 敏感操作(如转账、删账号)必须带服务端生成的
CSRF token,且 token 与用户 session 绑定;仅靠SameSite=Strict不够,旧版浏览器不支持 - 文件上传表单必须服务端限制:文件后缀(不只是扩展名,要读文件头)、大小、存储路径隔离(不放在 Web root 下)、访问 URL 由后端签发临时链接,而非直接暴露原始路径
怎么快速发现页面里藏着的敏感信息
很多漏洞不是代码写的,是人“写进去的”。HTML 注释、meta 标签、隐藏 DOM、JS 变量里,常有开发遗留的测试账号、API Key、内部路径、未删除的 debug 代码。
- 右键“查看网页源代码”,全局搜索:
TODO、FIXME、debug、admin、password、api_key、http://localhost、127.0.0.1 - 检查
<meta name="generator">、<meta name="description">,有时会暴露 CMS 版本或内部项目名 - 用浏览器 Elements 面板筛选
style="display:none"、class="hidden"、aria-hidden="true"的节点,展开看里面有没有注释或硬编码凭证
真正的难点不在找到某个 onerror,而在于确认整个数据流是否被同一套规则贯穿始终 —— 从 URL 参数进来,到 JS 处理,再到 DOM 插入,最后到服务端入库,每个环节的信任边界是否清晰。一个环节松动,整条链就失效。


















