当前位置:网站首页 > 技术博客 > 正文

csrf攻击防范



本文将带你了解什么是跨站请求伪造(CSRF)攻击?以及如何使用 Spring Security 来防范这些攻击。

CSRF 攻击有多种形式。

假如下面这个 GET 请求,用于一个已登录的用户向指定的银行账户 转账:

如果攻击者想把钱从受害者的账户转到自己的账户(),他需要让受害者触发请求:

有多种方法可以实现这一点:

  • 链接 - 攻击者可以说服/诱导受害者点击该链接,例如执行转账:
  • 图片 - 攻击者可能会使用 标签,将目标 URL 作为图片来源。换句话说,甚至不需要点击。请求将在页面加载时自动执行:

所以,涉及到敏感的业务,千万不能用 GET 请求。

假设转账 API 是一个 POST 请求。

在这种情况下, 和 标签都不起作用。

攻击者需要使用 :

然后,使用 JavaScript 自动提交表单:

在 Spring 应用中模拟 CSRF 攻击。

创建一个 “银行” 应用,定义一个转账 API :

还需要一个基本的 HTML 页面来触发银行转账操作:

这是在银行应用上运行的客户端页面。

如上,通过一个简单的链接实现了 ,通过一个简单的 实现了 。

现在、来看看攻击者页面的样子:

该页面在不同的应用上运行,即攻击者的应用。

最后,在本地运行银行应用和攻击者应用。

要使攻击奏效,用户需要使用 Session cookie 对银行应用进行身份认证。

首先,访问银行应用页面:

它将在浏览器上设置 cookie。

然后访问攻击者应用:

追踪源自此页面的请求,能够发现那些针对银行应用的请求。由于 Cookie 会自动随这些请求一起提交,Spring 会将它们视为来自银行页面的请求进行身份认证。

为了保护 MVC 应用,Spring 会在每个生成的视图中添加一个 CSRF Token。该 Token 必须在每次修改状态的 HTTP 请求(PATCH、POST、PUT 和 DELETE)中提交给服务器。这可以保护应用免受 CSRF 攻击,因为攻击者无法从自己的页面获取此 Token。

在旧版 XML 配置(Spring Security 4 之前)中,CSRF 保护默认是禁用的,可以根据需要启用它:

从 Spring Security 4.x 开始,默认启用 CSRF 保护。

该默认配置将 Token 添加到名为 的 属性中。

如果需要,可以禁用此配置:

现在,需要在请求中包含 CSRF Token。

属性包含以下信息:

  • - CSRF Token 值
  • - HTML 表单参数的名称,其中必须包含 Token 值
  • - HTTP Header 的名称,其中必须包含 Token 值

如果视图使用 HTML 表单,可以使用 和 值添加隐藏 input:

如果视图使用 JSON,则需要使用 和 值添加 HTTP 请求头信息。

首先在 标签中包含 Token 值和 Header 名称:

然后,用 JQuery 获取 标签值:

最后,使用这些值来设置 XHR Header:

无状态 API 是否需要 CSRF 保护?

如果无状态 API 使用基于 Token 的身份验证(如 JWT),就不需要 CSRF 保护。反之,如果使用 Session Cookie 进行身份验证,就需要启用 CSRF 保护

无状态 API 无法像 MVC 配置那样添加 Token,因为它不会生成任何 HTML 视图。

在这种情况下,可以使用 在 Cookie 中发送 CSRF Token:

此配置将为前端设置一个名为 的 Cookie。由于将 标志设置为 ,因此前端能使用 JavaScript 获取此 Cookie。

通过 JavaScript 从 列表中搜索 Cookie 值。

由于该列表以字符串形式存储,因此可以使用此 regex (正则)进行检索:

然后,必须向每个修改 API 状态的 请求发送 Token: POST、PUT、DELETE 和 PATCH。

Spring 会通过 Header 来接收它。

只需使用 JavaScript Fetch API 设置即可:

首先尝试在禁用 CSRF 时提交一个简单的 POST 请求:

如上,通过继承 类来获取常用的测试辅助方法。

注意,当用户拥有正确的凭证时,请求就会被成功执行,不需要额外的信息。

这意味着攻击者只需使用前面讨论过的任何攻击方式,就能入侵系统。

现在启用 CSRF 保护,看看有什么不同:

可以看到这次测试使用了不同的安全配置,即启用了 CSRF 保护。

现在,如果不包含 CSRF Token,POST 请求将直接失败,这当然意味着先前的攻击不再可行。

此外,测试中的 方法会创建一个 ,在请求中自动填充一个有效的 Token,以便进行测试。

本文介绍了 CSRF 攻击的几种方式,以及如何在 Spring 应用中使用 Spring Security 来避免 CSRF 攻击。


Ref:

  • 上一篇: lxml怎么使用
  • 下一篇: 图像质量评价算法
  • 版权声明


    相关文章:

  • lxml怎么使用2025-08-18 20:01:00
  • pycharm汉化教程2025-08-18 20:01:00
  • 二维码图片解码器2025-08-18 20:01:00
  • redis数据备份如何实现2025-08-18 20:01:00
  • 倒排索引算法2025-08-18 20:01:00
  • 图像质量评价算法2025-08-18 20:01:00
  • 结构体指针使用方法2025-08-18 20:01:00
  • 什么是余弦相似性2025-08-18 20:01:00
  • 进程线程的概念和区别2025-08-18 20:01:00
  • 流量监控工具app2025-08-18 20:01:00