最危险的HTML属性是href、src、onerror、onclick等事件处理器、formaction、target、style及SVG中的xlink:href;因其支持javascript:等伪协议或可执行上下文,用户可控输入未经校验直接渲染即触发XSS、跳转劫持等漏洞。

HTML标签属性本身不执行代码,但一旦被用户可控输入填充、未经校验就直接渲染,就会成为XSS、跳转劫持、CSRF放大、SSRF等漏洞的入口。查这类问题,核心是盯住“谁在控制这个属性值”和“浏览器怎么解析它”。
哪些HTML属性最危险?
不是所有属性都一样危险,关键看浏览器是否把它当指令执行:
-
href、src:支持javascript:、data:、file:等伪协议,可直接触发脚本或加载恶意资源 -
onerror、onclick等事件属性:哪怕写在字符串里,只要最终被当作属性绑定(如v-html或innerHTML插入),就会执行 -
formaction、action:若用户能控制值,可能绕过前端表单逻辑,提交到任意地址 -
target:单独用target="_blank"不加rel="noopener noreferrer",会暴露window.opener控制权 -
style:支持expression()(IE旧版)、url(javascript:...)等,现代浏览器限制多,但仍有绕过案例
怎么快速定位可疑属性值?
别靠肉眼扫全量HTML,聚焦三类高危模式:
- 所有带
javascript:、data:text/html;base64,、vbscript:的href/src值——直接记为高危,必须拦截或过滤 - 所有由 URL 参数、API 返回字段、用户评论内容动态拼进属性的场景,比如:
<a href="{{ user_input }}">或el.setAttribute('src', data.avatar) - 富文本编辑器输出的 HTML:检查是否允许设置
onxxx属性或任意href;CKEditor/TinyMCE 默认不限制,需手动配置allowedContent或后端净化
服务端生成的属性值为什么也要查?
后端模板看似安全,但容易忽略两点:
立即学习“前端免费学习笔记(深入)”;
- 模板变量未转义就插进属性上下文,比如:
<img src="{{ user_avatar }}">—— 若user_avatar是" onerror=alert(1) x=",结果就是<img src="" onerror=alert(1) x="">,属性被闭合并注入 - 使用
json_encode或htmlspecialchars时没指定上下文:PHP 的htmlspecialchars($s, ENT_QUOTES, 'UTF-8')只防 HTML 标签,不防属性内 JS 执行;更安全的是用js_escape+ 引号包裹,或改用 CSP 配合 - 硬编码敏感值进属性:比如
<input type="hidden" name="csrf_token" value="{{ token }}">—— 若token是静态或可预测的,等于把防重放钥匙贴在墙上
查的时候最容易漏掉什么?
真正卡住人的不是技术点,而是思维盲区:
- 注释里藏链接:
<!-- <a href="http://evil.com"> -->,有些 CMS 会自动解析注释 - CSS 中的
url()函数:background: url("javascript:alert(1)");,虽现代浏览器大多禁用,但在内网或老旧终端仍有效 - SVG 标签里的
xlink:href、onload:常被当成图片忽略,实则可执行脚本 - 自定义属性如
data-url、data-action被 JS 动态读取并赋给location.href或fetch(),这类“非标准但业务强依赖”的属性最难审计



















