xss高危位置需聚焦三类代码模式:innerhtml/outerhtml/document.write赋值语句、动态拼接json到script标签、未校验协议的a.href/iframe.src/img.src设置;富文本测试须覆盖事件属性、非常规标签及编码混淆绕过;url跳转漏洞重点检查redirect/next/to等参数及前端路由跳转逻辑。

前端HTML代码漏洞检测不是“扫一遍源码就完事”,而是要盯住数据从输入到渲染的每一步是否被污染。XSS是头号风险,DOM型和富文本场景最易漏;URL跳转和模板注入常被当成“小问题”忽略,但实际危害不亚于后端漏洞。
怎么快速定位XSS高危位置
别盲目扫全量HTML,先聚焦三类代码模式:
-
innerHTML、outerHTML、document.write()赋值语句——只要右边变量含location.search、location.hash、localStorage.getItem()或 API 返回值,基本就是XSS入口 - 拼接进
<script></script>标签的 JSON 数据,如<script>window.data = ${JSON.stringify(userInput)}</script>——未做 JS 字符串上下文编码,单引号、反斜杠、换行都会破坏结构 - 动态设置
a.href、iframe.src、img.src的地方,尤其当值来自 URL 参数(如redirect_to)且没校验协议时,javascript:伪协议可直接执行
用浏览器开发者工具的 **Sources → Event Listener Breakpoints → DOM Mutation** 打断点,再手动触发输入,能直观看到哪段JS把用户数据塞进了DOM。
富文本编辑器怎么测才不漏洞
富文本不是“开了白名单就安全”,它本质是把HTML当作数据处理,而浏览器只认语法。测试必须覆盖三类绕过:
- 事件属性:
<img src="x" onerror="alert(1)">、<p onmouseover="alert(1)"></p>——很多编辑器只过滤<script></script>,却放行on* - 非常规标签:
<svg onload="alert(1)"></svg>、<math href="javascript:alert(1)"></math>——HTML5新增标签常被过滤规则遗漏 - 编码与注释混淆:
<script>alert(1)</script>(实体编码)、<!-- <img src=x onerror=alert(1)> -->(注释包裹)——部分后端存储时解码,前端渲染时又没二次转义
真正可靠的净化只能靠 DOMPurify.sanitize() 这类基于真实HTML解析器的库,正则过滤 <.></.> 是自欺欺人。
URL跳转漏洞的隐蔽检查点
跳转漏洞常藏在看似无害的参数里,重点查这些字段名和用法:
- 参数名含
redirect、return、next、url、to的 GET/POST 请求 —— 用 Burp 修改为javascript:alert(1)或//evil.com看是否跳转 - 前端路由中
router.push()或window.location.href = params.to的调用 —— 检查是否用了URL()构造器做协议校验,还是简单startsWith('http')(后者会被http://attacker.com@trusted.com绕过) - 锚点跳转
location.hash被用于前端路由时,若直接el.innerHTML = location.hash.slice(1),攻击者可传入#<img src="x" onerror="alert(1)">
白名单必须精确到协议+域名,不能只拦 javascript: 就以为万事大吉。
HTML模板注入容易被当成XSS来处理
模板注入和XSS防御思路完全不同:XSS靠转义,模板注入靠隔离。关键判断点是——用户输入有没有被当作模板语法执行?
- 看模板引擎加载方式:
template.compile(userInput)、new Template('name', new StringReader(userInput))这类动态编译字符串的操作,99%危险 - 查模板语法调用:
${userInput?eval}(FreeMarker)、{{= userInput}}(art-template)、{{@userInput}}—— 这些是明确允许执行JS的指令,绝不能绑定用户数据 - 注意
include/import路径:可导致任意文件读取,和XSS无关但危害更大
最常被忽略的是:后端模板默认转义(如 {{data}})只防XSS,不防模板注入。如果业务逻辑把用户昵称拼进模板字符串再编译,${nickname} 就是执行入口,跟前端没关系。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











