首页 > 解决方案 > Laravel CSRF 保护是否提供 100% 的安全性?

问题描述

Laravel 文档说:

Laravel 会为应用程序管理的每个活动用户会话自动生成一个 CSRF “令牌”。此令牌用于验证经过身份验证的用户是实际向应用程序发出请求的人。由于此令牌存储在用户的会话中,并且每次会话重新生成时都会更改,因此恶意应用程序无法访问它。

Laravel 配置 session.php 文件保证会话 cookie 的生命周期默认为 120 分钟:

'lifetime' => env('SESSION_LIFETIME', 120)

所以让我们想象一下,例如,我在 Laravel 应用程序中进行身份验证并接收会话 cookie。如果在身份验证后的 120 分钟内我将访问恶意网站并受到 CSRF 攻击,会发生什么情况?当然,考虑到cors.phpconfig 设置为允许接受任何 (*) origin的事实('allowed_origins' => ['*'])

以我目前的理解,在身份验证后的这 120 分钟内,浏览器有会话 cookie,所以如果我去恶意网站并受到 CSRF 攻击,攻击就会成功。

如果我目前的理解是错误的,请纠正我?

标签: laravelcsrf

解决方案


因此,我的理解存在的问题是,我不知道您无法访问与您尝试访问的网站不同的来源的 cookie。所以在 csrf 的情况下,恶意网站的来源与 Laravel 服务器提供的 CSRF-TOKEN cookie 的来源不同,因此攻击失败。所以是的,laravel csrf 保护工作。

像我这样的初学者对 CSRF 保护的完整解释:

  1. 什么是 csrf 攻击?想象一下,您在域 A 的网站上进行了身份验证,并从服务于站点 A 的服务器接收到会话 cookie。另一个具有域 B 的恶意网站包含一个脚本,当您进入站点 B 时,该脚本会向服务于域 A 的服务器发出请求。只要您的浏览器包含网站 A 的会话 cookie,试图从网站 B 进行攻击的脚本就会成功。
  2. 那么 csrf 令牌如何帮助覆盖这个漏洞呢?现在 laravel 服务器向您发送带有 XSRF-TOKEN cookie 的响应,当您尝试使用来自域 A 的脚本发送 axios 请求时,axios 会自动将 XSRF-TOKEN 的值放置到 X-XSRF-TOKEN 标头以防同源请求(当网站A 具有与服务器同源的域)。对于具有非同源请求的恶意网站,脚本无法访问 XSRF-TOKEN cookie,因为无法访问其他来源的 cookie。因此 axios 不能将 XSRF-TOKEN 的值放置到请求标头或请求参数中。服务器检查 X-XSRF-TOKEN 或 csrf 令牌参数的传入请求,服务器无法找到它,因此服务器不验证请求。

推荐阅读