当前位置: 首页 > article >正文

深入理解前端安全:CSRF与XSS攻击详解

引言

在Web开发的世界里,安全性就像是房子的门锁。你可能觉得它不显眼,但一旦没了它,麻烦可就大了!本文将深入探讨两大前端安全威胁:CSRF(跨站请求伪造)和XSS(跨站脚本攻击)。通过生动的实例和实用的防御策略,让我们一起踏上这段“安全大冒险”吧!

一、CSRF攻击详解

1.1 什么是CSRF?

CSRF(Cross-Site Request Forgery,跨站请求伪造),听起来像个高大上的术语,但其实它就是恶搞用户的日常操作。攻击者通过引诱已认证用户访问恶意网站,利用用户的身份发起未授权请求。结果?用户可能会无意中执行一些危险操作,比如转账、修改密码等。

1.2 CSRF攻击原理

攻击者设计一个恶意页面,当用户在浏览器中访问时,浏览器会自动携带当前会话的认证信息(如Cookie)向目标网站发起请求。想象一下,你正在银行页面处理业务,突然跳出来一个“银行”链接,点击后转账到攻击者账户,连你都没反应过来!

经典案例:银行转账
<!-- 恶意网站中的代码 -->
<img src="https://your-bank.com/transfer?to=attacker&amount=10000" width="0" height="0">

只要已登录银行账户的用户点击了这个“看似无害”的图片,就会触发转账操作。浏览器会自动带上当前会话的Cookie,直接把钱转给攻击者。

1.3 更多CSRF示例

示例1:修改用户信息
<form action="https://social-media.com/update-profile" method="POST"><input type="hidden" name="email" value="hacker@example.com"><input type="hidden" name="password" value="newpassword">
</form>
<script>document.forms[0].submit();</script>
示例2:社交媒体发帖
fetch('https://social-media.com/post', {method: 'POST',body: JSON.stringify({content: 'Check out this scam site!'}),credentials: 'include'
});

1.4 CSRF防御措施

  1. CSRF Token:防止恶意请求的最好方法之一是引入CSRF Token。每个表单都带有一个随机生成的token,服务器验证该token才允许执行请求。

    <form action="/transfer" method="POST"><input type="hidden" name="_csrf" value="随机生成的token"><!-- 其他表单字段 -->
    </form>
    
  2. SameSite Cookie属性:确保Cookie只能在当前站点下发送,减少跨站点伪造请求的风险。

    Set-Cookie: sessionid=xxxx; SameSite=Strict; Secure; HttpOnly
    
  3. 检查Referer/Origin头部:可以验证请求来源,确保请求来自可信的页面。

    if (request.headers.referer !== 'https://yourdomain.com/') {return res.status(403).send('Forbidden');
    }
    
  4. 关键操作二次验证:如短信验证码、密码确认等,确保操作的合法性。

二、XSS攻击详解

2.1 什么是XSS?

XSS(Cross-Site Scripting,跨站脚本攻击)就像是Web页面上的“病毒”,攻击者通过注入恶意脚本到网页,借此窃取数据或执行不法行为。不同于CSRF,它直接攻击浏览器环境,让用户的浏览器成为攻击的“战场”。

2.2 XSS分类与示例

2.2.1 存储型XSS

特点:恶意脚本在目标服务器上被永久存储,所有访问该页面的用户都会受到影响。

案例:论坛评论注入恶意脚本

用户评论内容:<script>stealCookie()</script>

当其他用户查看评论时,恶意脚本便会执行,窃取他们的Cookie等敏感信息。

2.2.2 反射型XSS

特点:恶意脚本作为请求的一部分,服务器将其“反射”回响应中。

案例:搜索功能漏洞

https://vulnerable-site.com/search?q=<script>alert(1)</script>

攻击者将恶意脚本注入搜索查询中,当服务器返回结果时,浏览器执行脚本,导致潜在的危害。

2.2.3 DOM型XSS

特点:完全在客户端发生,不涉及服务器。攻击者通过改变页面的DOM结构来注入恶意脚本。

案例:不安全的innerHTML使用

document.getElementById('output').innerHTML = userInput;

当用户输入包含恶意脚本时,这段代码会将恶意脚本渲染到页面上,从而执行攻击。

2.3 更多XSS攻击向量

  1. 通过图片标签:利用onerror事件触发脚本。

    <img src="x" onerror="恶意代码">
    
  2. 通过CSS:在背景中注入JavaScript。

    <div style="background:url('javascript:恶意代码')">
    
  3. 通过HTML属性:如<a href="javascript:恶意代码">点击我</a>

2.4 XSS防御措施

  1. 输入验证与过滤:确保不允许注入恶意脚本。可以通过正则表达式等手段清除或过滤输入中的不安全字符。

    function sanitize(input) {return input.replace(/<script.*?>.*?<\/script>/gi, '');
    }
    
  2. 输出编码:对输出内容进行编码,避免恶意脚本被当作HTML标签解析。

    function htmlEncode(str) {return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
    }
    
  3. Content Security Policy (CSP):通过CSP来限制页面加载的资源来源,防止恶意脚本的执行。

    Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
    
  4. 使用安全API:避免使用不安全的API,如innerHTML,转而使用textContent等更安全的方式。

    // 不安全的
    element.innerHTML = userInput;// 安全的
    element.textContent = userInput;
    

三、CSRF与XSS对比

特性CSRFXSS
攻击目标利用用户身份执行操作窃取数据或执行恶意脚本
是否需要用户登录不一定
攻击方式伪造请求注入脚本
影响范围特定操作整个页面/应用
防御重点验证请求来源输入输出过滤

四、综合防御策略

  1. 前端防御

    • 使用现代框架(React/Vue等)的内置防护
    • 避免使用eval()innerHTML等危险API
    • 实现CSP策略
  2. 后端防御

    • 实现CSRF Token机制
    • 严格验证所有输入
    • 设置安全的HTTP头部
  3. 运维配置

    • 启用HTTPS
    • 设置安全的Cookie属性
    • 定期安全审计

五、真实案例分析

案例1:某社交平台CSRF漏洞

攻击者构造虚假“点赞”请求,导致用户无意中为恶意内容点赞。最终,该漏洞被及时修复,避免了大规模的用户操作被滥用。

案例2:电商网站XSS漏洞

攻击者通过商品评价注入脚本,窃取访问者的支付信息。幸好,安全团队迅速发现并修复了漏洞,避免了大量财务损失。

结语

CSRF与XSS攻击并不新鲜,但它们依然是攻击者的“最爱”。只有通过扎实的前端与后端防护、有效的输入输出验证和对安全细节的细致关注,才能在这场网络“战争”中立于不败之地。网络安全不仅仅是“加个锁”,更是保持警觉、不断强化防御的持续过程。

相关文章:

深入理解前端安全:CSRF与XSS攻击详解

引言 在Web开发的世界里&#xff0c;安全性就像是房子的门锁。你可能觉得它不显眼&#xff0c;但一旦没了它&#xff0c;麻烦可就大了&#xff01;本文将深入探讨两大前端安全威胁&#xff1a;CSRF&#xff08;跨站请求伪造&#xff09;和XSS&#xff08;跨站脚本攻击&#xf…...

Docker 中运行 JAR 文件

文章目录 步骤 1&#xff1a;准备文件结构步骤 2&#xff1a;编写 Dockerfile步骤 3&#xff1a;构建 Docker 镜像步骤 4&#xff1a;运行容器常见问题解决Q1&#xff1a;容器启动后立即退出Q2&#xff1a;时区不一致Q3&#xff1a;依赖外部服务&#xff08;如MySQL&#xff09…...

数据治理体系的“三驾马车”:质量、安全与价值挖掘

1. 执行摘要 数据治理已从合规驱动的后台职能&#xff0c;演变为驱动业务成果的战略核心。本文将深入探讨现代数据治理体系的三大核心驱动力——数据质量、数据安全与价值挖掘——它们共同构成了企业在数字时代取得成功的基石。数据质量是信任的基石&#xff0c;确保决策所依据…...

leetcode 二分查找应用

34. Find First and Last Position of Element in Sorted Array 代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {int low lowwer_bound(nums,target);int high upper_bound(nums,target);if(low high…...

Ngrok 内网穿透实现Django+Vue部署

目录 Ngrok 配置 注册/登录 Ngrok账号 官网ngrok | API Gateway, Kubernetes Networking Secure Tunnels 直接cmd运行 使用随机生成网址&#xff1a;ngrok http 端口号 使用固定域名生成网址&#xff1a;ngrok http --domain你的固定域名 端口号 Django 配置 1.Youre a…...

利用OLED打印调试信息: 控制PC13指示灯点灯的实验

Do口暗的时候才是高电平,因为光敏电阻传感器的高电平是依靠LM393电压比较器上引脚进入高阻态再加上上拉电阻上拉产生的高电平DO口什么时候会输出高阻态?电压比较器的正极输入电压大于负极输入电压,而正极输入电压是光敏电阻分得的电压,光敏电阻的阻值越大,已分得的电压就越大,…...

240422 leetcode exercises

240422 leetcode exercises jarringslee 文章目录 240422 leetcode exercises[237. 删除链表中的节点](https://leetcode.cn/problems/delete-node-in-a-linked-list/)&#x1f501;节点覆盖法 [392. 判断子序列](https://leetcode.cn/problems/is-subsequence/)&#x1f501;…...

mybatis mapper.xml中使用枚举

重点&#xff1a;application.propertis配置类 #TypeEnumHandler 这个类的包名&#xff0c;不是全路径 mybatis.type-handlers-packagecom.fan.test.handler两个枚举类&#xff1a; public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…...

【初级】前端开发工程师面试100题(二)

本题库共计包含100题,考察html,css,js,以及react,vue,webpack等基础知识掌握情况。 TypeScript篇 TypeScript和JavaScript有什么区别? TS是JS的超集,添加了静态类型系统,编译时检查类型错误,适合大型项目。interface和type有什么区别? interface主要用于描述对象形…...

Appium安装 -- app笔记

调试环境&#xff1a;JDK&#xff08;java&#xff09; SDK&#xff08;android&#xff09; Node.js 雷神模拟器&#xff08;或 真机&#xff09; Appium&#xff08;Appium Server【内外件&#xff08;dos内件、界面化工具&#xff09;】、Appium Inspector&#xff09; p…...

2025.04.23华为机考第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 星空探索者 问题描述 LYA是一位天文学爱好者,她拍摄了一张星空照片并将其数字化为二维亮度图。在这张图像中,每个像素点的值代表该位置的亮度。现在,LYA想要寻找特定亮度的星…...

【OpenGL】OpenGL学习笔记-1:VS2019配置OpenGL开发环境

在Visual Studio 2019中可以通过手动配置库文件或NuGet包管理器快速安装的方法配置OpenGL环境&#xff0c;详细步骤如下&#xff1a; 一、打开VS2019&#xff0c;创建新的控制台项目 二、方法一&#xff1a;手动配置GLEW/GLFW/GLAD库 GLFW是窗口管理和输入事件的基础设施&…...

集结号海螺捕鱼游戏源码解析(第二篇):水浒传捕鱼模块逻辑与服务器帧同步详解

本篇将全面解构“水浒传”子游戏的服务端核心逻辑、帧同步机制、鱼群刷新规则、客户端命中表现与服务器计算之间的协同方式&#xff0c;聚焦于 C 与 Unity3D 跨端同步的真实实现过程。 一、水浒传捕鱼模块资源结构 该模块包含三部分核心目录&#xff1a; 子游戏/game_shuihuz…...

从零到一实现 .NET Core 项目 + JWT 认证

知识文档:从零到一实现 .NET Core 项目 + JWT 认证 1. 知识点概述 本项目通过实现 JWT 身份验证,完成以下功能: 用户登录并生成 JWT Token。使用 [Authorize] 属性保护受控资源。测试登录和受保护资源访问的完整流程。JWT(JSON Web Token)是一种轻量级的认证机制,广泛用…...

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候&#xff0c;有两种情况&#xff1a; 两个Packet的buf引用的是同一数据缓存空间&#xff0c;这时候要注意数据缓存空间的释放问题&#xff1b;两个Packet的buf引用不同的数据缓存空间&#xff0c;每个Packet都有数据缓存…...

QML 样式库

在 QML 中&#xff0c;样式库&#xff08;或 UI 框架&#xff09;用于快速构建一致且美观的界面。Qt/QML 本身不提供内置的完整样式库&#xff0c;但可以通过以下方式实现样式管理或使用第三方库。 1. Qt Quick Controls 2 样式系统 Qt Quick Controls 2 是官方提供的 UI 组件…...

小白自学python第一天

学习python的第一天 一、常用的值类型&#xff08;先来粗略认识一下~&#xff09; 类型说明数字&#xff08;number&#xff09;包含整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、复数&#xff08;complex&#xff09;、布尔&#xff08;boolean&…...

2022 年 9 月青少年软编等考 C 语言七级真题解析

目录 T1. 二叉树的深度T2. 迷宫思路分析T3. Sequence思路分析T4. Priority Queue 练习题思路分析T1. 二叉树的深度 题目链接:SOJ D1164 此题为 2022 年 3 月七级第三题原题,见 2022 年 3 月青少年软编等考 C 语言七级真题解析中的 T3。 T2. 迷宫 题目链接:SOJ D1213 一…...

手动实现LinkedList

前言 大家好&#xff0c;我是Maybe。最近在学习数据结构中的链表&#xff0c;自己手动实现了一个LinkedList。我想与大家分享一下。 思维导图 代码部分 package Constant;public class constant {public static final String INDEX_IS_WRONG"输入的下标不合法"; }p…...

maven的安装与配置、IDEA集成maven

一、maven的安装与配置环境变量 maven的下载与安装&#xff0c;配置环境变量与验证【附安装包3.6.1&#xff0c;3.8.8&#xff0c;3.9.9】-CSDN博客 参考资料&#xff1a;黑马程序员 二、IDEA集成 2.1 当前工程设置 1. 打开 Maven 设置路径&#xff1a;在 IDEA 中&#xf…...

Axure中继器表格:实现复杂交互设计的利器

在产品原型设计领域&#xff0c;Axure凭借其强大的元件库和交互功能&#xff0c;成为设计师们手中的得力工具。其中&#xff0c;中继器元件在表格设计方面展现出了独特的优势&#xff0c;结合动态面板等元件&#xff0c;能够打造出功能丰富、交互体验良好的表格原型。本文将深入…...

VR 全景看车的独特优势​

全方位沉浸式体验​ VR 全景看车最显著的优势&#xff0c;就是为用户带来了全方位的沉浸式体验。通过 VR 技术&#xff0c;用户仿佛置身于真实的汽车展厅或试驾场景之中&#xff0c;能够 360 度无死角地观察车辆的外观、内饰、细节等各个方面 。无论是车辆的整体造型&#xff0…...

前端 JavaScript 处理流式响应的坑

给使用 JavaScript 的同学提个醒&#xff01; 浏览器端处理流式响应&#xff0c;想要完美体验 请使用 Fetch API。 Axios 无法使用stream来直接处理真正的流式响应&#xff08;但 Node.js 中可以使用 stream&#xff09;&#xff0c;这与浏览器底层 HTTP 请求实现的限制有关。 …...

AI Agent认知框架(ReAct、函数调用、计划与执行、自问自答、批判修正、思维链、思维树详解和对比,最后表格整理总结

以下是主流AI Agent认知框架的详细说明、对比及表格总结&#xff1a; 1. 各认知框架详解 (1) ReAct (Reasoning Action) 定义&#xff1a;结合推理&#xff08;Reasoning&#xff09;和行动&#xff08;Action&#xff09;的循环过程。核心机制&#xff1a; 模型先推理&…...

springBoot_自定义starter

Spring Boot 自定义 Starter 详解 一、Spring Boot Starter 基础概念 1.1 什么是 Spring Boot Starter Spring Boot Starter 是 Spring Boot 的一个核心概念&#xff0c;它是一种特殊的依赖描述符&#xff0c;包含了一组可以集成到应用中的依赖项。简单来说&#xff0c;Star…...

搭建TypeScript单元测试环境

我们在学习TypeScript的时候如果能够搭建一个单元测试的环境&#xff0c;那写些demo会很简单&#xff0c;下面我们使用jest来搭建一个单元测试环境 Jest 是一个由 Facebook 开发并开源的 JavaScript 测试框架&#xff0c;被广泛应用于前端和 Node.js 项目的单元测试。以下是关…...

第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)

重要信息 官网&#xff1a;www.mmeat.net 时间&#xff1a;2025年06月23-25日 地点&#xff1a;中国-深圳 部分展示 征稿主题 智能制造和工业自动化 复合材料与高性能材料先进制造技术 自动化机器人系统 云制造与物联网集成 精密制造技术 智能生产线优化 实时数据分析与过…...

leetcode 1143. Longest Common Subsequence

目录 题目描述 第一步&#xff0c;明确并理解dp数组及下标的含义 第二步&#xff0c;分析明确并理解递推公式 第三步&#xff0c;理解dp数组如何初始化 第四步&#xff0c;理解遍历顺序 代码 题目描述 这道题和第718题的区别就是&#xff0c;本题求的是最长公共子序列的长…...

SSH 私钥文件权限控制指南

1. 为什么必须严格控制私钥文件权限&#xff1f; 安全机制&#xff1a;SSH 协议强制要求私钥文件必须仅对所有者可读&#xff0c;防止未授权访问。 风险&#xff1a;若权限过松&#xff08;如其他用户可读&#xff09;&#xff0c;SSH 客户端会拒绝连接&#xff0c;避免私钥泄…...

stack和queue的学习

stack的介绍 stack的文档介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;…...