最易触发XSS的HTML属性包括onerror、onclick等事件处理器,href中javascript:协议,src/srcdoc等可执行脚本属性;innerHTML/outerHTML因解析执行HTML而比textContent更危险。

直接用浏览器开发者工具 + 手动注入测试,比任何自动化工具都快、准、可控——前提是知道往哪打、怎么打、打完怎么看。
哪些HTML属性一出现就该立刻标红
不是所有属性都危险,但以下这些只要出现在用户输入回显位置,基本等于开了XSS后门:
-
onerror、onclick、onload、onfocus等所有以on开头的事件处理器(哪怕写成onCut或onAnimationStart) -
href值以javascript:、vbscript:开头(注意大小写混淆:JaVaScRiPt:) -
src、srcdoc、data属性中含javascript:或未过滤的 HTML 字符串(srcdoc尤其容易被忽略,它等于一个内联 iframe) -
style中含expression((IE)、url(javascript:或background-image:后接伪协议
检查方法:在 Elements 面板 Ctrl+F 搜索 on\w+=、href="j、srcdoc= 等关键词,再看值是否来自 URL 参数或表单输入。
innerHTML / outerHTML / document.write 怎么一眼识别风险
这些不是“可能”危险,而是“只要用了且参数不可信,就一定高危”。关键看右侧赋值来源:
立即学习“前端免费学习笔记(深入)”;
- 如果右边是
location.search、location.hash、document.referrer、localStorage.getItem、fetch()返回的 JSON 字段,直接判定为 DOM 型 XSS 风险点 -
insertAdjacentHTML()和v-html(Vue)、dangerouslySetInnerHTML(React)同级危险,搜索时别漏掉框架特有 API - 警惕看似安全的拼接:
el.innerHTML = '<div>' + userInput + '</div>'—— 单引号/双引号闭合后,userInput仍可注入>或事件属性
快速定位:在 Sources 面板全局搜索 innerHTML =、.write(、insertAdjacentHTML,逐行看右侧变量是否受控。
URL参数反射到DOM的典型绕过模式
很多漏洞藏在 <input value="xxx"> 这种“静态”结构里。攻击者不靠 <script>,而是靠引号闭合 + 事件注入:
- 测试 payload:
" onfocus="alert(1)(注意开头的英文双引号) - 若页面生成:
<input value="" onfocus="alert(1)">,说明已成功注入 - 绕过常见过滤:
"替代";oncontextmenu替代onclick;javascript:alert(1)绕过简单正则 - 验证点不止 input:也检查
title、alt、placeholder等属性,它们同样支持事件处理器
操作建议:手动改 URL 参数,用开发者工具实时看 Elements 面板 DOM 是否变化,别只盯 Network 响应体。
为什么不用现成扫描器反而更可靠
第一代工具靠字符串匹配(找 alert(1) 是否原样返回),误报率高;第二代调真实浏览器,速度慢且难覆盖自定义解析逻辑。而人工+浏览器调试能直接确认三件事:
- 输入是否真的进入 DOM(而非被转义为
<script>) - 是否处于可执行上下文(比如在
script标签内 vs 在div文本中) - 是否被 CSP 拦截(看 Console 报错:Refused to execute inline script)
真正容易被忽略的,是那些没走服务器、纯前端拼接的 DOM 型漏洞——它们不会出现在 HTTP 响应里,只能靠断点追踪 location.search 到 innerHTML 的整条链路。



















