laravel - Laravel CSRF 保护是否提供 100% 的安全性?
问题描述
Laravel 文档说:
Laravel 会为应用程序管理的每个活动用户会话自动生成一个 CSRF “令牌”。此令牌用于验证经过身份验证的用户是实际向应用程序发出请求的人。由于此令牌存储在用户的会话中,并且每次会话重新生成时都会更改,因此恶意应用程序无法访问它。
Laravel 配置 session.php 文件保证会话 cookie 的生命周期默认为 120 分钟:
'lifetime' => env('SESSION_LIFETIME', 120)
所以让我们想象一下,例如,我在 Laravel 应用程序中进行身份验证并接收会话 cookie。如果在身份验证后的 120 分钟内我将访问恶意网站并受到 CSRF 攻击,会发生什么情况?当然,考虑到cors.php
config 设置为允许接受任何 (*) origin的事实('allowed_origins' => ['*'])
。
以我目前的理解,在身份验证后的这 120 分钟内,浏览器有会话 cookie,所以如果我去恶意网站并受到 CSRF 攻击,攻击就会成功。
如果我目前的理解是错误的,请纠正我?
解决方案
因此,我的理解存在的问题是,我不知道您无法访问与您尝试访问的网站不同的来源的 cookie。所以在 csrf 的情况下,恶意网站的来源与 Laravel 服务器提供的 CSRF-TOKEN cookie 的来源不同,因此攻击失败。所以是的,laravel csrf 保护工作。
像我这样的初学者对 CSRF 保护的完整解释:
- 什么是 csrf 攻击?想象一下,您在域 A 的网站上进行了身份验证,并从服务于站点 A 的服务器接收到会话 cookie。另一个具有域 B 的恶意网站包含一个脚本,当您进入站点 B 时,该脚本会向服务于域 A 的服务器发出请求。只要您的浏览器包含网站 A 的会话 cookie,试图从网站 B 进行攻击的脚本就会成功。
- 那么 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 令牌参数的传入请求,服务器无法找到它,因此服务器不验证请求。
推荐阅读
- java - 为什么我在 switch for java 中使用了“默认”一词?
- javascript - 错误 TS2339:“温度”类型上不存在属性“摄氏度”
- java - 以 pdf 格式发送字节
- ios - Swift 5 如何使用按钮删除和复制表格视图单元格
- python - 如何加速下面的代码?实现没有中心元素的 maxpool
- python - 添加 https 支持后无法访问托管在 EC2 上的 Flask 应用程序
- reactjs - 用于初始化 useState 钩子的传入属性在调用钩子的更新程序方法时得到更新
- ssl - 如何通过 Jrockit Keytool 导入 crt 和 key
- python - 如何将抓取的数据列表转换为 excel 列?
- python - 计数值,使用 Pandas 保留重复项