XSS及防御

76 阅读2分钟

跨站脚本攻击(XSS)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,来窃取用户数据、劫持用户会话或执行其他恶意操作。XSS攻击主要分为三种类型:存储型XSS、反射型XSS和基于DOM的XSS。

1. 存储型XSS(Stored XSS)

描述: 存储型XSS攻击是指恶意脚本被存储在服务器上,并在用户访问受感染的页面时执行。常见的存储位置包括数据库、日志文件、评论系统等。

示例:

  1. 攻击者在评论区提交恶意脚本:
    <script>alert('XSS Attack');</script>
    
  2. 该脚本被存储在服务器的数据库中。
  3. 当其他用户访问包含该评论的页面时,恶意脚本被执行。

2. 反射型XSS(Reflected XSS)

描述: 反射型XSS攻击是指恶意脚本通过URL参数或表单提交被注入,并在服务器响应中反射回用户浏览器执行。反射型XSS通常通过钓鱼邮件或恶意链接传播。

示例:

  1. 攻击者构造一个恶意链接:
    http://example.com/search?q=<script>alert('XSS Attack');</script>
    
  2. 用户点击该链接,服务器将URL参数中的恶意脚本反射回响应中。
  3. 用户浏览器执行恶意脚本。

3. 基于DOM的XSS(DOM-based XSS)

描述: 基于DOM的XSS攻击是指恶意脚本通过修改页面的DOM结构直接在客户端执行,而不经过服务器。攻击者利用JavaScript操作DOM节点,注入恶意代码。

示例:

  1. 攻击者构造一个恶意链接:
    http://example.com/#<script>alert('XSS Attack');</script>
    
  2. 用户点击该链接,浏览器解析URL片段并执行恶意脚本。

防御措施

  1. 输入验证: 对所有用户输入进行严格的验证,确保输入数据符合预期格式和范围。

    const username = req.body.username;
    if (!/^[a-zA-Z0-9]+$/.test(username)) {
      return res.status(400).send('Invalid username');
    }
    
  2. 输出转义: 对所有输出到HTML页面的内容进行转义,防止特殊字符被解释为HTML或JavaScript代码。

    function escapeHTML(str) {
      return str.replace(/&/g, '&amp;')
                .replace(/</g, '&lt;')
                .replace(/>/g, '&gt;')
                .replace(/"/g, '&quot;')
                .replace(/'/g, '&#039;');
    }
    
  3. 使用安全的库和框架: 使用经过安全审计的库和框架,避免手动处理复杂的安全逻辑。

    const express = require('express');
    const helmet = require('helmet');
    const app = express();
    app.use(helmet()); // 使用Helmet中间件提高安全性
    
  4. 内容安全策略(CSP): 配置内容安全策略,限制页面可以加载的资源,防止恶意脚本执行。

    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted.cdn.com">