Laravel CSRF 保护是否提供 100% 的安全性?
Does Laravel CSRF protection provide 100% safety?
Laravel 文档说:
Laravel automatically generates a CSRF "token" for each active user session managed by the application. This token is used to verify that the authenticated user is the person actually making the requests to the application. Since this token is stored in the user's session and changes each time the session is regenerated, a malicious application is unable to access it.
Laravel 配置 session.php 文件保证会话 cookie 生命周期默认为 120 分钟:
'lifetime' => env('SESSION_LIFETIME', 120)
让我们想象一下,例如,我在 Laravel 应用程序中进行身份验证并接收会话 cookie。如果我在身份验证后 120 分钟内访问恶意网站并受到 CSRF 攻击,会发生什么情况?当然,考虑到 cors.php
配置设置为允许接受任何 (*) 来源 ('allowed_origins' => ['*'])
.
以我目前的理解在认证浏览器有session cookie后的这120分钟内,所以如果我去一个恶意网站并暴露于CSRF攻击,攻击就会成功。
如果我目前的理解有误,请指正?
所以我的理解存在问题,我没有意识到您无法访问与您尝试访问的网站不同的来源 cookie。因此,在 csrf 的情况下,恶意网站的来源与 Laravel 服务器提供的 CSRF-TOKEN cookie 的来源不同,因此攻击失败。所以是的 laravel csrf 保护有效。
CSRF防护详解给初学者:
- 什么是 csrf 攻击?
想象一下,您通过域 A 的网站进行身份验证,并从为站点 A 提供服务的服务器接收到 session cookie。另一个具有域 B 的恶意网站包含一个脚本,该脚本会在您输入时向为域 A 提供服务的服务器产生请求网站 B。只要您的浏览器包含网站 A 的 session cookie,试图从网站 B 进行攻击的脚本就会成功。
- 那么csrf token是如何帮助覆盖这个漏洞的呢?
现在 laravel 服务器向您发送带有 XSRF-TOKEN cookie 的响应,当您尝试使用来自域 A 的脚本发送 axios 请求时,axios 会自动将 XSRF-TOKEN 的值放入 X-XSRF-TOKEN header 在 same-origin 请求的情况下(当网站 A 具有与服务器同源的域时)。对于非 same-origin 请求的恶意网站,脚本无法访问 XSRF-TOKEN cookie,因为无法访问其他来源的 cookie。所以 axios 不能将 XSRF-TOKEN 的值放在请求 header 或请求参数中。服务器检查 X-XSRF-TOKEN 或 csrf 令牌参数的传入请求,服务器无法找到它,因此服务器不会验证请求。
Laravel 文档说:
Laravel automatically generates a CSRF "token" for each active user session managed by the application. This token is used to verify that the authenticated user is the person actually making the requests to the application. Since this token is stored in the user's session and changes each time the session is regenerated, a malicious application is unable to access it.
Laravel 配置 session.php 文件保证会话 cookie 生命周期默认为 120 分钟:
'lifetime' => env('SESSION_LIFETIME', 120)
让我们想象一下,例如,我在 Laravel 应用程序中进行身份验证并接收会话 cookie。如果我在身份验证后 120 分钟内访问恶意网站并受到 CSRF 攻击,会发生什么情况?当然,考虑到 cors.php
配置设置为允许接受任何 (*) 来源 ('allowed_origins' => ['*'])
.
以我目前的理解在认证浏览器有session cookie后的这120分钟内,所以如果我去一个恶意网站并暴露于CSRF攻击,攻击就会成功。
如果我目前的理解有误,请指正?
所以我的理解存在问题,我没有意识到您无法访问与您尝试访问的网站不同的来源 cookie。因此,在 csrf 的情况下,恶意网站的来源与 Laravel 服务器提供的 CSRF-TOKEN cookie 的来源不同,因此攻击失败。所以是的 laravel csrf 保护有效。
CSRF防护详解给初学者:
- 什么是 csrf 攻击? 想象一下,您通过域 A 的网站进行身份验证,并从为站点 A 提供服务的服务器接收到 session cookie。另一个具有域 B 的恶意网站包含一个脚本,该脚本会在您输入时向为域 A 提供服务的服务器产生请求网站 B。只要您的浏览器包含网站 A 的 session cookie,试图从网站 B 进行攻击的脚本就会成功。
- 那么csrf token是如何帮助覆盖这个漏洞的呢? 现在 laravel 服务器向您发送带有 XSRF-TOKEN cookie 的响应,当您尝试使用来自域 A 的脚本发送 axios 请求时,axios 会自动将 XSRF-TOKEN 的值放入 X-XSRF-TOKEN header 在 same-origin 请求的情况下(当网站 A 具有与服务器同源的域时)。对于非 same-origin 请求的恶意网站,脚本无法访问 XSRF-TOKEN cookie,因为无法访问其他来源的 cookie。所以 axios 不能将 XSRF-TOKEN 的值放在请求 header 或请求参数中。服务器检查 X-XSRF-TOKEN 或 csrf 令牌参数的传入请求,服务器无法找到它,因此服务器不会验证请求。