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

检查哪些 HTML 属性最容易触发 XSS
真正危险的不是 <script> 标签本身,而是那些能执行 JavaScript 的事件属性和 URI 属性。浏览器在解析这些属性值时,会主动执行其中的脚本逻辑,只要内容未被正确编码或过滤,就可能被利用。
以下属性需重点排查:
-
onerror、onclick、onload、onfocus等所有以on开头的事件处理器 -
href中以javascript:开头的值(如href="javascript:alert(1)") -
src或data属性中包含javascript:或vbscript:协议 -
srcdoc(常被忽略)——它直接渲染 HTML 字符串,等价于内联页面,极易成为 DOM 型 XSS 入口
为什么 innerHTML 和 outerHTML 要比 textContent 更危险
当你看到代码里出现 element.innerHTML = userInput,基本可以判定存在高危 XSS 风险。因为 innerHTML 会把字符串当作 HTML 解析并执行,而 textContent 只渲染为纯文本,不触发任何解析逻辑。
常见误判点:
立即学习“前端免费学习笔记(深入)”;
- 用
document.write()拼接用户输入:等同于直接写入 HTML 流,无任何转义机制 - 用
insertAdjacentHTML()插入动态内容:和innerHTML同等级风险 - 框架中手动调用
v-html(Vue)或dangerouslySetInnerHTML(React):明确绕过默认转义,必须确保输入已由服务端严格净化
URL 参数反射到属性时的典型绕过模式
很多漏洞藏在看似“安全”的 URL 回显逻辑里。例如页面从 location.search 提取 q=xxx,再填入 <input value="xxx"> —— 表面看只是属性值,但攻击者可闭合引号注入事件。
测试时用这个 payload 就能快速验证:" onfocus="alert(1)
如果最终生成的是:<input value="" onfocus="alert(1)">,说明已成功注入。
更隐蔽的绕过方式包括:
- 用
"(HTML 实体)代替英文双引号,绕过简单正则匹配 - 用
oncut、oncontextmenu等低频事件属性,避开常规检测规则 - 在
style属性中使用expression()(IE 旧版)或url(javascript:...)(部分 CSS 解析器)
DOM 型 XSS 最容易被漏掉的三个位置
这类漏洞不经过服务器响应,全靠前端 JS 动态拼接,审查时容易只盯后端模板而忽略客户端逻辑。
重点关注:
-
location.hash或location.search直接赋值给innerHTML、document.title、iframe.src -
document.referrer被用于构造链接或显示来源,未经编码就插入 DOM - 基于
localStorage或sessionStorage读取的数据,未经清洗就用于渲染(比如记住上次搜索词后自动填充并高亮)
DOM 型漏洞往往在开发者工具里看不到原始恶意 payload,因为它只存在于运行时内存中,必须动态调试或静态扫描结合 DOM 操作链分析才能捕获。



















