存在XSS隐患。需检查用户输入是否未经转义直接插入HTML、属性或JS字符串,重点审查innerHTML、v-html、dangerouslySetInnerHTML及on*事件、javascript:协议等高危入口。

直接看页面是否把用户输入原样塞进 HTML、属性或 JS 字符串里——只要没做转义或过滤,基本就存在 XSS 隐患。
检查 innerHTML 和类似高危 DOM 操作
这类写法等于把字符串当 HTML 解析执行,是 DOM 型 XSS 最常见入口。
- 全局搜索代码中所有
element.innerHTML =、element.outerHTML =、document.write()、insertAdjacentHTML() - 重点追踪等号右边是否来自
location.search、location.hash、localStorage、fetch响应体等不可信源 - Vue 项目查
v-html,React 查dangerouslySetInnerHTML,这些 API 明确绕过默认转义,必须确认输入已由服务端净化
排查事件属性和 javascript: 协议
浏览器会主动执行这些属性里的 JS 逻辑,哪怕没有 <script> 标签。
- 检查所有以
on开头的属性:onclick、onerror、onload、onfocus等,尤其是动态拼接进标签的场景 - 检查
href、src、formaction中是否拼接了用户输入,例如:<a href="javascript:alert(1)"> - 测试时用
" onfocus="alert(1)注入到value属性里,观察是否生成<input value="" onfocus="alert(1)">
验证 URL 参数反射是否闭合 HTML 上下文
很多漏洞藏在看似“只填 value”的地方,攻击者能靠引号闭合+注入事件完成突破。
立即学习“前端免费学习笔记(深入)”;
- 找页面从
location.search或URLSearchParams提取参数,并插入到双引号/单引号属性中的位置 - 用 payload
" onmouseover="alert(1)测试;若返回 HTML 是<div title="xxx" onmouseover="alert(1)">,说明已触发 - 注意实体编码绕过:
"可能被解码后重新闭合属性,尤其在服务端先解码再拼接的流程中
抓包看 AJAX 响应内容是否被不安全渲染
动态加载的内容如果未经处理就进 innerHTML,风险和静态页面一样高,但更难发现。
- 用浏览器开发者工具的 Network 面板,筛选 XHR/Fetch 请求,看响应是否含用户可控字段(如评论、昵称、富文本)
- 若响应是 JSON,检查 JS 是否提取字段后直接赋值给
innerHTML;若是 HTML 片段,确认是否经DOMPurify.sanitize()处理 - 用 Burp Suite 修改响应体,注入
<img src=x onerror=alert(1)>,再刷新页面观察是否弹窗
最容易被忽略的是:DOM 型 XSS 不经过服务器,连响应里都看不到 payload,全靠前端 JS 自己“投毒”。审查时必须打开 Sources 面板设断点,顺着 location、fetch().then() 这些源头一路跟到 innerHTML 或事件绑定处——中间任何一步没转义,就是缺口。



















