跨站请求伪造(CSRF)介绍

devtools/2025/1/19 23:38:54/

一、什么是跨站请求伪造(CSRF)

跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是一种针对网站的恶意利用方式,也被称为“One Click Attack”或“Session Riding”。

CSRF攻击通过伪装来自受信任用户的请求,利用受信任的网站执行未授权的操作。尽管CSRF听起来与跨站脚本(XSS)相似,但两者的攻击方式和原理大相径庭。XSS利用站点内的信任用户,而CSRF则通过用户浏览器冒充用户身份向服务器发送伪造请求。

二、CSRF攻击原理

CSRF攻击的基本原理是攻击者诱使已经登录的用户(例如在银行网站上)在不知情的情况下执行攻击者预设的操作。CSRF攻击通常涉及三个角色:受害者(合法用户)、攻击者(恶意网站)和目标网站(存在CSRF漏洞的网站)。以下是CSRF攻击的典型过程:

1、用户登录:受害者打开浏览器,访问受信任的网站A,输入用户名和密码登录。
2、生成Cookie:登录成功后,网站A生成Cookie信息并返回给浏览器,用于记录用户的登录状态。
3、访问恶意网站:受害者在未退出网站A之前,在同一浏览器中打开一个新的标签页,访问攻击者构建的恶意网站B。
4、发送伪造请求:网站B包含攻击性代码,发出一个请求要求访问第三方站点A。浏览器在用户不知情的情况下携带Cookie信息,向网站A发出请求。
5、请求处理:网站A根据用户的Cookie信息以受害者的权限处理该请求,导致来自网站B的恶意代码被执行。

三、CSRF攻击的危害

1、利用已通过认证的用户权限更新设定信息:如更改密码、修改个人信息等。
2、利用已通过认证的用户权限购买商品:在用户不知情的情况下进行消费。
3、利用已通过认证的用户权限在留言板发表言论:发布不良信息等。

四、模拟一次CSRF攻击

虽然在实际环境中模拟CSRF攻击可能涉及法律和道德问题,但我们可以通过理论描述来模拟这一过程。

攻击场景
假设有两个网站:

网站A:一个受信任的银行网站,用户已经登录并持有有效的Cookie。
网站B:一个恶意网站,由攻击者控制。

步骤
1、用户登录网站A:用户输入用户名和密码,成功登录后,网站A在用户浏览器中设置了一个Cookie,用于维持会话。
2、用户访问网站B:用户在同一浏览器的另一个标签页中访问了网站B。
3、网站B发起请求:网站B包含一段恶意代码,该代码在用户不知情的情况下向网站A发起一个请求(如转账请求)。
4、浏览器发送请求:由于用户的浏览器仍然保持与网站A的会话,该请求会带上用户的Cookie,使得请求看起来是合法的。
5、网站A处理请求:网站A接收到请求后,根据Cookie中的用户信息执行相应的操作(如转账),而用户对此一无所知。

五、如何防止CSRF攻击
为了防止CSRF攻击,可以采取以下措施:

1、使用CSRF Token
这是最常见和有效的防御CSRF攻击的方法。服务器生成一个唯一的令牌(Token),并将其嵌入到每个表单或请求中。服务器在处理请求时验证令牌的有效性。在Spring Boot中,可以通过配置CSRF保护来实现这一点。这种方式需要服务器存储和管理Token。

示例(Spring Boot)

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().and().authorizeRequests().anyRequest().authenticated();}
}

在表单中包含CSRF令牌:

<form action="/submit" method="post"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /><!-- 其他表单字段 --><button type="submit">Submit</button>
</form>

2、验证HTTP请求的来源
服务器可以检查HTTP请求的来源地址(如Referer头),以确保请求来自预期的来源。然而,这种方法并不总是可靠的,因为Referer头可以被伪造或删除。现在较少使用。

示例代码(Java Servlet)

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;publicclass CsrfFilter implements Filter {privatestaticfinal String TRUSTED_REFERER = "https://trusted.com";@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String referer = httpRequest.getHeader("Referer");if (referer != null && referer.startsWith(TRUSTED_REFERER)) {chain.doFilter(request, response);} else {((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "CSRF protection");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

3、设置SameSite Cookie属性
SameSite Cookie属性可以防止浏览器在跨站点请求中发送Cookie。当设置SameSite属性为Strict或Lax时,浏览器将不会在跨站点请求中发送Cookie。这是一种有效的防御CSRF攻击的方法,但需要浏览器支持。

示例代码(Java Servlet)

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;publicclass SameSiteCookieFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletResponse httpResponse = (HttpServletResponse) response;Cookie[] cookies = ((HttpServletRequest) request).getCookies();if (cookies != null) {for (Cookie cookie : cookies) {cookie.setHttpOnly(true);cookie.setSecure(true);cookie.setPath("/");cookie.setMaxAge(3600);cookie.setSameSite("Strict"); // 或者 "Lax"httpResponse.addCookie(cookie);}}chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

4、其他措施
双重提交Cookie:服务器在响应中设置一个CSRF令牌Cookie,并在每个请求中要求客户端将该令牌作为请求参数发送回来。服务器验证请求中的令牌和Cookie中的令牌是否匹配。这种方式不需要服务器存储Token,但需要通过客户端代码实现。
使用HTTPS:确保所有通信都通过安全的HTTP(HTTPS)进行,以避免中间人攻击。
实施内容安全策略(CSP):CSP可以帮助减少XSS(跨站脚本)的风险,从而间接减少CSRF攻击的风险。

六、结论
CSRF攻击是一种严重的网络安全威胁,但通过采取适当的防范措施,如使用CSRF Token、验证HTTP请求的来源、设置SameSite Cookie属性等,可以有效地减少CSRF攻击的风险。在Java开发中,可以利用Spring Security等框架来方便地实现这些防范措施,从而保护Web应用的安全


http://www.ppmy.cn/devtools/151948.html

相关文章

java权限修饰符

Java 的访问修饰符&#xff08;Access Modifiers&#xff09;是控制类、方法、变量等成员访问范围的关键工具。它们定义了类、方法或成员变量的可见性&#xff0c;以及在不同位置&#xff08;如不同包或子类&#xff09;是否能访问这些成员。Java 提供了四种主要的访问修饰符&a…

Hadoop•用Web UI查看Hadoop状态词频统计

听说这里是目录哦 通过Web UI查看Hadoop运行状态&#x1f407;一、关闭防火墙二、在物理计算机添加集群的IP映射三、启动集群四、进入HDFS的Web UI 词频统计&#x1f9a9;1、准备文本数据2、在HDFS创建目录3、上传文件4、查看文件是否上传成功5、运行MapReduce程序6、查看MapRe…

ES6中有哪些作用域

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;作用域&#xff08;Scope&#xff09;是指变量、函数和对象在代码中的可访问范围。ES6 引入了新的作用域规则&#xff0c;除了传统的全局作用域和函数作用域外&#xff0c;还新增了块级作用域。以下是 ES6 中的主要…

STM32 HAL库函数入门指南:从原理到实践

1 STM32 HAL库概述 STM32 HAL(Hardware Abstraction Layer)库是ST公司专门为STM32系列微控制器开发的一套硬件抽象层函数库。它的核心设计理念是在应用层与硬件层之间建立一个抽象层&#xff0c;这个抽象层屏蔽了底层硬件的具体实现细节&#xff0c;为开发者提供了一套统一的、…

vue2:实现上下两栏布局,可拖拽改变高度

要拖拽改变两栏高度,那么总高度要确定,在拖拽的过程中,实时根据光标位置计算两栏高度,所以: 1、最外层有一个box, 高度是屏幕高度screenHeight; 2、该值在页面挂载时获取初始值(window.innerHeight-100),这里减少100,因为窗口上面有工具栏; 3、监听窗口resize事件…

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习&#xff1a;docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别&#xff1f; Docker Desktop for Linux 提供用户友好的图形界面&#xff0c;可简化容器和服务的管理。它包括 Docker Engine&#xff0c…

力扣动态规划-2【算法学习day.96】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

NVIDIA视频编解码

开源了两个项目&#xff1a;英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装&#xff0c;由于官方自带的demo晦涩难懂并且每块都是独立的&#xff0c;我对SDK进行二次封装并形成了一套较为完整的视频编解码流程&#xff0c;调用简单&#xff0c;有完整的测…