什么是 XSS(跨站脚本攻击)?

embedded/2025/1/14 14:47:12/

XSS(Cross-Site Scripting)是一种常见的安全漏洞,攻击者通过在页面中注入恶意脚本代码,诱导用户的浏览器执行这些代码,从而达到窃取用户数据、伪造操作或劫持用户会话的目的。

XSS 的攻击目标通常是用户的浏览器,而不是服务器本身。


XSS 分类

  1. 存储型 XSS

    • 恶意脚本被永久存储在服务器上(如数据库中)。
    • 用户访问包含恶意脚本的页面时,脚本被加载并执行。
    • 示例: 攻击者在留言板中输入:
      <script>alert('Your session is hijacked!');</script>
      
      如果网站没有对用户输入进行过滤,其他用户访问留言板时会触发这个脚本。
  2. 反射型 XSS

    • 恶意脚本通过 URL 参数或其他途径传递,服务器直接将其返回到页面中。
    • 用户点击带有恶意脚本的链接时,脚本被执行。
    • 示例: 用户访问这样的链接:
      http://example.com?query=<script>alert('Hacked');</script>
      
      如果服务器直接将 query 参数渲染到页面中,脚本会执行。
  3. DOM 型 XSS

    • 恶意脚本通过浏览器端的 JavaScript 操作直接注入,不经过服务器。
    • 示例: 如果网站的某个功能是从 URL 中读取参数并插入到 DOM 中,而没有过滤:
      document.body.innerHTML = "Welcome, " + location.search.substring(1);
      
      当用户访问 http://example.com/?<script>alert('XSS');</script> 时,恶意代码会直接被执行。

XSS 的危害

  • 窃取用户的登录信息(如 Cookies 和 Session Token)。
  • 劫持用户会话(冒充用户进行操作)。
  • 在页面中加载恶意内容(如钓鱼网站、广告等)。
  • 操作用户的浏览器(如重定向到恶意网站)。

XSS 的防范措施

1. 输入过滤
  • 对用户的输入进行严格过滤和验证。
  • 禁止用户输入 HTML、JavaScript 等脚本内容。
  • 示例: 使用 正则表达式 或专用库过滤用户输入:
    const sanitizeInput = (input) => input.replace(/<[^>]+>/g, "");
    

2. 输出编码
  • 在将用户输入的内容输出到页面之前,对内容进行编码。
  • 确保 HTML 特殊字符(如 <, >, ", ' 等)不会被解释为 HTML。
  • 示例: 使用框架自带的转义工具:
    {{ userInput }}
    
    Vue 和 React 等现代前端框架默认会对动态内容进行 HTML 编码。

3. Content Security Policy (CSP)
  • 设置 CSP 限制页面中允许加载的资源。
  • 禁止页面加载外部的 JavaScript 文件或执行内联脚本。
  • 示例(设置 HTTP 响应头):
    Content-Security-Policy: script-src 'self'
    
    这会阻止外部脚本的执行。

4. 避免使用危险的 DOM 操作
  • 避免直接插入 HTML 到页面中。
  • 不安全的代码
    document.body.innerHTML = userInput;
    
  • 安全的代码: 使用安全的 DOM API,比如:
    const div = document.createElement("div");
    div.textContent = userInput;
    document.body.appendChild(div);
    

5. 使用框架的安全特性
  • 使用现代框架(如 Vue、React、Angular),它们默认会对动态内容进行 HTML 转义。
  • 在 Vue 中,默认情况下:
    <p>{{ userInput }}</p>
    
    会将 userInput 中的 <script> 转义为普通字符串。

6. HTTP-Only 和 Secure Cookie
  • 避免将敏感信息存储在客户端可访问的地方(如 localStoragesessionStorage)。
  • 将 token 或 session ID 存储在 HttpOnly 的 Cookie 中,这样 JavaScript 无法读取它。
  • 示例(后端设置 Cookie):
    Set-Cookie: token=abc123; HttpOnly; Secure
    

7. 验证用户输入
  • 检查输入的格式和内容是否符合预期。
  • 例如,用户名只能包含字母和数字:
    const isValidUsername = (input) => /^[a-zA-Z0-9]+$/.test(input);
    

8. 使用专用库
  • 使用可靠的第三方库处理用户输入或 HTML 内容。
  • 示例库:
    • DOMPurify:清理用户输入的 HTML,防止 XSS。
      import DOMPurify from "dompurify";
      const cleanHtml = DOMPurify.sanitize(userInput);
      

9. 设置 SameSite Cookie
  • 限制 Cookie 的跨站点发送,防止被用于跨站请求伪造(CSRF)攻击。
  • 示例:
    Set-Cookie: sessionId=abc123; SameSite=Strict;
    

总结

优先事项
  1. 对用户输入 过滤转义
  2. 避免直接操作 HTML,优先使用框架的模板引擎。
  3. 使用安全的存储方式(如 HttpOnly Cookie)管理 token。
  4. 设置 CSP 限制脚本执行来源。
  5. 检查后端是否也对用户数据进行了验证,前后端共同防范。

如果你想了解具体实现的代码或者更多示例,我可以进一步说明!


http://www.ppmy.cn/embedded/153863.html

相关文章

Python爬虫-爬取汽车之家全部汽车品牌的brandid(品牌ID)

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 本文以汽车之家平台为例子,获取所有汽车品牌的“全部品牌ID”,即brandid数据。如下所示: 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下看正文详…

关于C语言初步的一些基础知识整理(2)

“本篇是对于C语言初步中一些基础知识的简单整理&#xff0c;内容较为琐碎&#xff0c;但实用” 在C语言中&#xff0c;格式控制符是用于指定数据输出格式的特殊字符&#xff0c;不同的数据类型有着其对应的格式控制符。具体的&#xff1a; %f 用于输出浮点型数据&#xff08…

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue新能源汽车充电桩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

相机小孔成像模型与透视变换

0 背景 本文用于记录小孔相机成像的数学模型推导&#xff0c;并讨论特定条件下两个相机之间看到图像的变换关系。 1 小孔成像模型 小孔成像模型如上图所示。物理世界发光点P&#xff0c;经过小孔O投影到物理成像平面&#xff0c;形成像点I’。 简易起见&#xff0c;构造虚拟成…

leetcode39.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果…

Debian之Maven安装

本地压缩包安装&#xff08;推荐&#xff09; 下载地址&#xff1a;https://maven.apache.org/download.cgi # 将安装包移动到当前目录 cd /usr/local # && mkdir maven && cd maven # 在线下载&#xff08;https://dlcdn.apache.org/maven/&#xff09; wg…

【pycharm】远程部署失败,查看日志

pycharm 远程部署失败,查看日志 远程一直失败,gateway超时会还知道拉取一份日志: 在./root 下 发现了崩溃日志,启动崩溃了,导致backend一直无法启动。win11就是一直在connect到ubuntu的后端pycharm。。gateway 拉取的日志 我上传的linux版本的pycharm暂时存在dist目录下,…