HTML本身不执行逻辑,但作为XSS、信息泄露、Clickjacking等攻击的直接载体,必须结合响应头、DOM行为与动态渲染逻辑交叉验证;CSP仅通过HTTP响应头生效,meta标签不支持关键指令,需检查Response Headers及控制台违规报告;XSS高危位置包括未转义的HTML内容、属性值、href、注释、meta标签及v-html等危险API;Clickjacking防护依赖X-Frame-Options或frame-ancestors指令,JS防框架易被绕过;富文本、音视频标签等非传统位置若属性值可控且服务端未校验,亦可触发攻击。

前端HTML代码本身不执行逻辑,但它是XSS、信息泄露、Clickjacking等攻击的直接载体。光靠“看源码”不行,必须结合响应头、DOM行为、动态渲染逻辑三者交叉验证。
怎么确认CSP是否真在起作用
CSP不是写进<meta>就生效的。浏览器只认HTTP响应头里的Content-Security-Policy字段,<meta http-equiv="Content-Security-Policy">仅作降级兼容,且不支持report-uri、nonce等关键指令。
- 打开开发者工具 → Network → 刷一次HTML请求 → 查Response Headers里有没有
Content-Security-Policy - 如果没有,说明服务端配置没走通,Nginx/Apache/后端框架(如Express的helmet)漏配了
- 故意在控制台执行
eval("alert(1)")或插入<script nonce="xxx">alert(1)</script>(nonce值错误),看是否报Refused to evaluate a string as JavaScript或Refused to execute inline script - 同时检查Console里是否有CSP violation报告,以及是否向
report-uri地址发出了POST请求
HTML源码里哪些位置最容易藏XSS和敏感信息
用户输入一旦未经转义就输出到这些位置,基本等于开后门:
-
<div>{{user_input}}</div>:未做HTML实体编码,<script>或onerror可直接触发 -
<input value="{{user_input}}">:属性值上下文,需用双引号+HTML编码,否则可闭合标签注入事件 -
<a href="{{user_input}}">:若输入为javascript:alert(1)或data:text/html,<script>...,可能绕过简单过滤 -
<!-- {{comment}} -->:注释里藏密钥、内部路径、API密钥很常见,别忽略 -
<meta name="description" content="{{user_input}}">:SEO字段常被忽略,但一样可注入
特别注意:React/Vue默认转义插值,但v-html、dangerouslySetInnerHTML、innerHTML = ...是高危操作,必须人工审计。
立即学习“前端免费学习笔记(深入)”;
怎么快速发现Clickjacking风险
核心是看页面是否允许被<iframe>嵌入——这决定了它能不能成为UI重绘攻击的画布。
- 检查响应头:必须有
X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'none';SAMEORIGIN仅防跨域嵌入,同域下仍可利用 - 手动测试:本地建一个HTML文件,用
<iframe src="目标URL"></iframe>加载,看是否能成功显示 - 注意
<iframe sandbox="...">的权限控制粒度:缺少allow-scripts或allow-same-origin能缓解,但不能替代服务端头策略 - JS防框架脚本(如
if (top !== self) top.location = self.location;)容易被绕过,仅作辅助,不可依赖
富文本、音视频标签这些“非传统”位置怎么审
它们不写脚本,但可能成为XSS或信息泄露的跳板:
-
<video src="{{user_controlled_url}}">:若src来自用户输入且未校验协议,可能指向javascript:或恶意data:URI(尤其在旧版浏览器) -
<audio>、<source>同理,还要检查服务器是否对媒体文件返回正确的Content-Type,避免MIME sniffing绕过 - 富文本内容(如
innerHTML = user_html):CSP拦不住DOM插入,必须用DOMPurify.sanitize()处理,且注意它返回的是字符串,不是自动挂载的DOM节点 - 上传后的图片
<img src="/uploads/{{filename}}">:若filename可控且服务端未重命名,可能被构造为xx.jpg%3Cscript%3E...,需检查URL解码与渲染链路
真正的难点不在标签本身,而在“谁控制这个属性值”以及“服务端是否做了二次校验”。所有动态拼接的HTML,都要逆向追踪到数据源头,一查到底。



















