静态HTML页面虽不执行逻辑,但仍是XSS、Clickjacking、可访问性缺陷和信息泄露高发区;需分层扫描:用axe-core检测image-alt等violations,检查onerror等事件属性与javascript:伪协议,验证X-Frame-Options或CSP frame-ancestors响应头,并人工审查注释、meta标签及隐藏内容。

静态HTML页面本身不执行逻辑,但仍是XSS、Clickjacking、可访问性缺陷和隐藏敏感信息的高发区。扫描不是“跑个工具就完事”,而是分层确认:输出上下文是否安全、响应头是否防御嵌入、源码是否暴露线索、结构是否满足基础无障碍。
用 axe-core 快速抓出可访问性硬伤
可访问性漏洞大多写死在HTML源码里,alt、role、lang 缺失无法靠JS补救。直接在浏览器控制台运行:
await (await fetch('https://cdn.jsdelivr.net/npm/axe-core@4.10.2/axe.min.js')).text().then(eval); axe.run({shadowDom: true}).then(console.log)
重点关注 violations 中的 image-alt、color-contrast、heading-order。常见卡点:
- 页面未加载完成就执行 → 改成
document.readyState === 'complete' && axe.run() - 用了 Web Components 或动态插入内容 → 必须加
{shadowDom: true} -
impact: 'minor'的条目(如某些 SVG 报告)别急着修,先人工确认是否真实影响键盘导航或屏幕阅读器
检查内联脚本与事件属性是否引入XSS风险
静态HTML里的 <script> 标签只是表象,真正危险的是那些把用户输入直接拼进JS字符串或HTML属性的地方。重点搜:
立即学习“前端免费学习笔记(深入)”;
- 所有
onclick、onerror、onload等事件属性 -
href="javascript:..."、src="data:text/html,..."这类伪协议调用 -
<script>块中是否出现类似var msg = "<%= user_input %>"的服务端模板占位符(即使没渲染,也说明后端可能未转义)
如果发现 innerHTML 赋值语句(哪怕只是示例代码),立刻标记为高风险 —— 它不需要后端参与就能触发XSS。
验证响应头是否防Clickjacking
静态页面被嵌入恶意iframe是点击劫持的前提。仅看HTML源码没用,必须查HTTP响应头:
- 打开开发者工具 → Network → 刷新页面 → 点开HTML请求 → 查看Response Headers
- 确认是否存在
X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'none' - 若两者都缺失,攻击者可轻松用透明
<iframe>覆盖你的页面
注意:<meta http-equiv="X-Frame-Options"> 无效,浏览器只认HTTP头。
手动翻源码找隐藏线索和误配标签
自动化工具会漏掉人为埋的坑。逐行扫HTML源码时盯紧这几处:
-
<!--注释里有没有临时注释掉的调试代码、API密钥、数据库连接串? -
<meta name="generator">、<meta name="description">是否泄露技术栈或内部路径? -
style="display:none"或class="hidden"包裹的内容,是否实际包含敏感操作入口(比如未授权的管理按钮)? -
<video>或<audio>的src是否指向可被篡改的外部地址?是否缺少crossorigin导致CSP绕过?
最易忽略的是:静态页常被当作“无后端”而放松警惕,但只要它加载了外部JS、拼接了URL参数、或依赖服务端模板生成,XSS和信息泄露风险就真实存在。



















