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

直接看属性值是否可控、是否被浏览器当作可执行上下文解析,是识别隐藏注入最有效的方式。单纯过滤 <script></script> 标签毫无意义,真正危险的是那些浏览器会主动执行的属性。
哪些 HTML 属性会触发 JavaScript 执行
浏览器在解析这些属性时,只要值里含 JS 逻辑,就会执行——不管它是不是在 <script></script> 标签里。
-
onerror、onclick、onload、onfocus等所有以on开头的事件处理器(包括冷门如oncut、oncontextmenu) -
href中以javascript:或vbscript:开头的值(如href="javascript:fetch('/api/steal')") -
src、srcdoc、data属性中含javascript:协议(srcdoc尤其危险,等价于内嵌 HTML 页面) -
style中使用expression()(IE)或url(javascript:...)(部分旧 CSS 解析器)
为什么 innerHTML 比 textContent 危险得多
看到 element.innerHTML = userInput 基本可以判定高危 XSS 存在。因为 innerHTML 会把字符串当 HTML 解析并执行;而 textContent 只渲染纯文本,不触发任何解析逻辑。
- 同等级风险操作还包括:
document.write()、insertAdjacentHTML()、Vue 的v-html、React 的dangerouslySetInnerHTML - 框架自动转义只覆盖默认渲染路径,手动绕过(如上述 API)等于主动放弃防护
- 即使内容看起来只是“填个 value”,比如
<input value="<img src=x onerror=alert(1)>">,攻击者也能闭合引号完成注入
如何快速验证属性注入是否生效
不用等后端响应,直接用浏览器开发者工具改 DOM 或构造 URL 参数测试即可。
- 对 URL 参数反射场景,用 payload:
" onfocus="alert(1),观察是否生成类似<input value="" onfocus="alert(1)"> - 对
src类属性,尝试src="javascript:alert(1)",注意现代浏览器可能拦截,但旧版或特定 CSP 配置下仍可触发 - 检查
srcdoc是否拼接用户输入:若存在<iframe srcdoc="' + userInput + '"></iframe>,几乎必然可注入 - 留意 HTML 实体绕过:
"替代英文双引号、"等,能绕过简单正则过滤
最容易被忽略的 DOM 型 XSS 位置
这类漏洞不经过服务器返回,全靠前端 JS 动态拼接,审查时极易漏掉。
-
location.hash或location.search直接赋值给innerHTML、document.title、iframe.src -
document.referrer被用于构造链接或显示来源,未经编码就插入 DOM - 从
localStorage或sessionStorage读取的数据,未经清洗就用于渲染(比如保存了上次搜索关键词)
真正难防的不是显眼的 <script></script>,而是那些看似无害、却在属性里悄悄执行脚本的组合。审查时得盯着每个动态拼接点,问一句:这个值最终进了哪个属性?那个属性会不会执行?
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











