跨站请求伪造(CSRF)介绍

ops/2025/1/21 2:31:15/

一、什么是跨站请求伪造(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/ops/151810.html

相关文章

.Net Core微服务入门系列(一)——项目搭建

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

华为数通HCIE备考经验分享

在分享我的考试心得前我先介绍一下我自己&#xff0c;我叫郑同学&#xff0c;22岁&#xff0c;就读于深圳信息职业技术学院移动通信技术专业&#xff0c;在2024年的9月&#xff0c;我成功获得了HCIE-Datacom证书。 考证契机 我的备考之旅始于去年2023年的华为ICT大赛。在这场…

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(下)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

【Python】使用 selenium模拟敲键盘输入的方法汇总

我在使用selenium弄模拟登陆&#xff0c;需要模拟输入账号和密码&#xff0c;往往都使用 selenium 的send_keys 函数。 可是我昨天在写测试的时候&#xff0c;有时候有些网站&#xff0c;居然使用send_keys 函数&#xff0c;无法在输入框里输入文字&#xff01; 在Python中&a…

SimpleHelp远程管理软件存在任意文件读取漏洞(CVE-2024-57727)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

「实战应用」如何为DHTMLX JavaScript 甘特图添加进度线

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 今天&#xff0c;您将学习如何使用进度线补充JavaScript 甘特图&#xff0c;以便于监控项目进度。 DHTMLX Gantt 最新试用版下载 …

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk&#xff0c;里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…

推理模型专题 | 开源类O1:Marco-o1技术全面解读

引言 简介 Marco推理数据集 通过MCTS扩展解空间 前置知识&#xff1a;蒙特卡罗树搜索&#xff08;MCTS&#xff09; MCTS扩展解空间 推理行动策略 行动选择 思考后的反思 实验 设置 主要结果 翻译任务案例研究 总结 0. 引言 小伙伴们好&#xff0c;我是《小窗幽…