答案:直接检查输出是否可控、是否转义、是否执行,即可判断大部分xss等风险;重点排查innerhtml、v-html、dangerouslysetinnerhtml等危险操作及onerror、javascript:、srcdoc等高危属性。

直接看输出是否可控、是否转义、是否执行,就能判断大部分风险。HTML本身不运行业务逻辑,但它是XSS、Clickjacking、外链劫持等漏洞的最终落地层,所有后端防护都可能被前端一处 innerHTML 或漏掉的 rel="noopener" 绕过。
检查所有动态插入点是否用了 innerHTML 或类似危险操作
这是最常见也最致命的XSS入口。只要看到 element.innerHTML = userInput、v-html(Vue)、dangerouslySetInnerHTML(React),就必须确认输入已由服务端净化,且前端未做二次拼接。
- 浏览器开发者工具里搜
innerHTML、outerHTML、document.write、insertAdjacentHTML - 特别注意 location.hash / location.search 解析后直接赋值的场景,比如
document.title = new URLSearchParams(location.search).get('q') - 富文本编辑器回显内容若没走白名单过滤,哪怕只允许
p、img标签,也可能被onerror或src="data:text/html,..."绕过
扫描所有外链是否缺失 rel="noopener noreferrer"
漏掉这个属性,目标页可通过 window.opener 修改原页面跳转或窃取登录态。CMS导入、用户粘贴、Markdown渲染生成的链接最容易出问题。
- 用正则快速筛查:
/]*href=["']https?:\/\/(?!(?:localhost|127\.0\.0\.1|yourdomain\.com))/i,再检查匹配项是否含noopener - 已有
rel="nofollow"的,不能覆盖,要合并为rel="nofollow noopener noreferrer" - 注意:
target="_blank"单独存在即高风险,必须配noopener;target="_self"则无需
验证响应头与HTML中是否存在框架嵌入防护
没有 X-Frame-Options 或 Content-Security-Policy: frame-ancestors,页面就可能被恶意网站用 <iframe></iframe> 嵌套,实施点击劫持(Clickjacking)。
- 浏览器开发者工具 → Network → 任一HTML响应 → Headers → 检查是否有
X-Frame-Options: DENY或Content-Security-Policy包含frame-ancestors 'none' - 手动测试:本地建一个HTML文件,用
<iframe src="https://your-site.com"></iframe>加载,看是否能成功显示 - 如果用了
<iframe sandbox="..."></iframe>,确认 sandbox 属性没开allow-scripts或allow-same-origin等高危权限
识别高危HTML属性和伪协议使用
真正执行JS的不是 <script></script>,而是那些浏览器自动解析并触发的属性值。它们常被静态扫描忽略,但危害明确。
- 重点 grep:
onerror、onclick、onload、onfocus、href="javascript:、src="javascript:、srcdoc= -
href中出现javascript:alert(1)或vbscript:...是典型信号;srcdoc值若来自用户输入,等价于内联HTML页面 - style 属性中慎用
expression()(IE旧版)或url(javascript:...),部分CSS解析器仍会执行
复杂点在于:很多风险不出现在模板里,而出现在运行时拼接的字符串中——比如一段从API拉回来的JSON,前端用 replace() 插进HTML,却忘了对变量做转义。这类DOM型XSS最难被扫描工具捕获,必须结合代码逻辑人工走读。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











