什么是 CSRF?如何防止 CSRF 攻击?

简介: CSRF 攻击是一种常见且危险的 Web 安全漏洞,攻击者可以通过伪造用户请求,执行恶意操作,作为程序员,为了防御 CSRF 攻击,常见的策略包括使用 CSRF Token、检查 Referer 或 Origin 头、设置 SameSite Cookie 属性以及双重提交 Cookie。因为程序员对于 CSRF 攻击可以做的事情还是很有限,所以,承担主要责任的是安全部门或者运维部门,但是作为程序员,我们需要具备这些安全意识,在安全等级比较高的需求中也需要把这些安全因素考虑在内。

CSRF 攻击是一种常见且危险的 Web 安全漏洞,攻击者可以通过伪造用户请求,执行恶意操作,这篇文章,我们将一起分析什么是 CSRF?CSRF是如何工作的?以及我们该如何预防 CSRF?

什么是 CSRF?

CSRF,全称 Cross-Site Request Forgery,中文翻译为跨站请求伪造,它是一种网络安全漏洞,攻击者通过伪造用户的请求,利用用户在已登录的情况下的身份验证信息,向服务器发送恶意请求,从而执行未经用户授权的操作。


CSRF攻击通常发生在用户已经登录了某个网站的情况下,攻击者在用户不知情的情况下利用用户的身份信息发送恶意请求,导致服务器误以为是用户发送的合法请求。


如下图所示,CSRF攻击大致由两部分组成:

  • 跨站点:用户登录到一个网站,并且被骗点击了攻击者构建的另一个网站链接,这代表了 CSRF 的“跨站点”部分。
  • 请求伪造:当受害者用户在同一浏览器中打开链接时,会向该网站发送一个伪造的请求,其中包含攻击者设置的值以及受害者与该网站关联的所有 cookie。

CSRF 如何工作?

CSRF攻击一般是按照下面 2个步骤进行:

  1. 利用会话Cookie
  2. 构造CSRF攻击

利用会话Cookie

CSRF攻击会利用了会话cookie,该 cookie在浏览器和服务器之间共享,由于 HTTP请求是无状态的,因此服务器无法区分浏览器发送的两个请求。


但是有许多情况下,我们希望服务器能够将一个 HTTP请求与另一个相关联。例如,登录请求后跟随的请求来检查账户余额或转账,只有在登录请求成功后,服务器才会允许这些请求,我们将这些请求组称为会话。


使用Cookie来保存会话信息,服务器将特定客户端的会话信息打包到一个cookie中,并将其发送到客户端的浏览器。对于每个新请求,浏览器通过将cookie(带有会话密钥)发送回服务器来重新识别自己。


攻击者劫持(或利用)这个cookie,以欺骗用户将攻击者构建的请求发送到服务器。

构造 CSRF攻击

攻击者构造 CSRF攻击的广泛步骤序列包括以下步骤:

  • 识别和探索易受攻击的网站,以寻找可以利用的感兴趣的功能(诱饵)
  • 创建CSRF攻击 URL
  • 诱导点击 URL


接下来,我们再更详细地了解每个步骤。

识别和探索易受攻击的网站

在计划 CSRF攻击之前,攻击者需要识别感兴趣的功能,例如资金转账。攻击者还需要了解网站中的一个有效 URL,以及 URL接受的有效请求模式,此 URL应导致目标应用程序中的状态更改操作。


常见的一些状态更改操作示例如下:

  • 更新账户余额
  • 创建客户记录
  • 转账


与状态更改操作相反,查询不会在服务器中更改任何状态。例如,查看用户资料,查看账户余额等不会在服务器中更新任何内容。


攻击者还需要找到 URL参数的正确值,否则,目标应用程序可能会拒绝伪造的请求。


用于探索易受攻击网站的一些常见技术包括:

  • 查看HTML源代码:检查网页的HTML源代码,以识别包含感兴趣功能的链接或按钮。
  • Web应用程序调试工具:使用 WebScarab、Tamper Dev等 Web应用程序调试工具分析客户端和服务器之间交换的信息。
  • 网络嗅探工具:使用网络嗅探工具(如 Wireshark)分析客户端和服务器之间交换的信息。


例如,假设攻击者已经识别了一个网站 yuanjava.com 来尝试 CSRF攻击,攻击者使用上述技术探索了这个网站,并发现了一个带有CSRF漏洞的 URL yuanjava.com/account 用于转账。

创建CSRF攻击 URL

攻击者接下来将尝试构建一个用于与受害者共享的攻击 URL,假设应用程序中的转账功能使用 POST方法,向另一个账户(账号为6666)转账 100元,合法请求将如下所示:

POST https://yuanjava.com/account?amount=100&accountNumber=6666


攻击者将创建一个攻击 URL,将 15000元转账给另一个可疑账户(账号为8888),URL:https://yuanjava.com/account?amount=15000&accountNumber=8888


当受害者点击这个攻击 URL,15000元将被转账到攻击者的账户(账号为8888)。

诱导点击 URL

创建了攻击 URL后,攻击者还必须欺骗受害者用户点击它,为此,攻击者创建了一种诱导,并使用任何社会工程攻击方法欺骗受害者用户点击恶意URL。


常见的诱导方式有:

  • 将攻击URL包含在HTML图像元素中
  • 将攻击URL放在受害者用户经常在登录应用程序时访问的页面上
  • 通过电子邮件发送攻击 URL

如何防御 CSRF 攻击?

为了防御 CSRF 攻击,可以采用以下几种常见的策略:

  • 使用 CSRF Token:在表单提交时,加入一个随机生成的唯一 token,并在服务器端进行验证,只有包含正确 token 的请求才被认为是合法的。
  • 检查 Referer 或 Origin 头:通过检查请求头中的 Referer 或 Origin 字段,确保请求来源于受信任的页面。
  • SameSite Cookie 属性:将 Cookie 的 SameSite 属性设置为 Strict 或 Lax,限制跨站点请求携带 Cookie。
  • 双重提交 Cookie:在每个请求中,同时通过 Cookie 和请求参数提交一个相同的 token,服务器端验证两者是否一致。
  • 安全部门或者购买安全云产品


如下代码示例,在 Java层创建一个配置类,启用 CSRF 保护:

import org.springframework.context.annotation.Configuration;
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().and().authorizeRequests().antMatchers("/").permitAll().anyRequest().authenticated();
    }
}

解释说明:

  • Spring Security CSRF Token:Spring Security 默认启用了 CSRF 保护。在我们创建的 SecurityConfig 类中,http.csrf().and() 部分启用了 CSRF 保护。Spring Security 会自动生成一个 CSRF Token,并在每个请求中进行验证。
  • 表单中的 CSRF Token:在 form.html 文件中, 部分插入了 CSRF Token。Spring Security 提供了一个 _csrf 对象,其中包含了 parameterName 和 token,分别表示 CSRF Token 的参数名和值。
  • CSRF Token 验证:当请求提交时,Spring Security 会验证请求中的 CSRF Token。如果验证失败,将返回 403 Forbidden 错误。

总结

CSRF 攻击是一种常见且危险的 Web 安全漏洞,攻击者可以通过伪造用户请求,执行恶意操作,作为程序员,为了防御 CSRF 攻击,常见的策略包括使用 CSRF Token、检查 Referer 或 Origin 头、设置 SameSite Cookie 属性以及双重提交 Cookie。


因为程序员对于 CSRF 攻击可以做的事情还是很有限,所以,承担主要责任的是安全部门或者运维部门,但是作为程序员,我们需要具备这些安全意识,在安全等级比较高的需求中也需要把这些安全因素考虑在内。

相关文章
|
6月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
127 0
|
安全 NoSQL Java
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
120 0
|
SQL 安全 前端开发
渗透攻击实例-邪恶的CSRF(社会工程学)
渗透攻击实例-邪恶的CSRF(社会工程学)
|
6月前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
943 0
|
12天前
|
存储 Web App开发 安全
如何防范 CSRF 攻击
CSRF(跨站请求伪造)攻击是一种常见的安全威胁。防范措施包括:使用Anti-CSRF Token、检查HTTP Referer、限制Cookie作用域、采用双重提交Cookie机制等,确保请求的合法性与安全性。
|
12天前
|
网络安全 数据安全/隐私保护
什么是 CSRF 攻击
CSRF(跨站请求伪造)攻击是指攻击者诱导用户点击恶意链接或提交表单,利用用户已登录的身份在目标网站上执行非授权操作,如转账、修改密码等。这种攻击通常通过嵌入恶意代码或链接实现。
|
20天前
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
58 4
|
19天前
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
47 2
|
21天前
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
51 3
|
14天前
|
SQL 存储 安全
什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?
理解并防范XSS、SQL注入和CSRF攻击是Web应用安全的基础。通过采用严格的输入验证、使用安全编码实践以及实现适当的身份验证和授权机制,可以有效防止这些常见的Web攻击,保障应用程序和用户的数据安全。
25 0