CSRF(跨站请求伪造)在 Laravel 中无法正常工作

CSRF (Cross Site Request Forgery) does not work as expected in Laravel

我正在使用 "Laravel Code Bright" 学习 Laravel。在这本书的"Form Security"部分,讲到在使用Form::Open()方法生成表单输入时,Laravel如何生成秘密隐藏代码来防止"CSRF - Cross Site Request Forgery"。

我尝试了一个示例来访问将使用外部表单处理表单的路由。首先,我在没有 "before"=>"csrf" 过滤器 附加到路由的情况下完成了它,我得到了我期待的答案,即外部形式能够访问路由。

对于第二个测试,我在路由中添加了"before"=>"csrf"过滤器。当我点击外部表单的提交按钮时,页面一直加载了很长时间,没有显示任何结果就放弃了,页面是空白的。这意味着 "before"=>"csrf" 过滤器 阻止了此外部表单访问路由。

对于我的第三次测试,我复制了原始表单的隐藏令牌(通过查看浏览器的源代码页面)并将其添加到外部表单并再次尝试并通过单击该外部表单提供的提交按钮我得到与第一次测试相同的结果,即它显示的结果意味着它能够通过我从原始表单添加的隐藏令牌访问路由。

我的理解是,如果您在表单中添加隐藏令牌以防止 "CSRF" 并且攻击者查看浏览器的源页面并复制隐藏令牌并将其添加到他的表单中,他仍然可以定位您的路线,因为隐藏令牌将始终在浏览器的查看源页面中可见。

我的问题是,有没有更好的方法来防止 "CSRF" 即使攻击者复制隐藏令牌并添加到他的表单?

我使用的外部表单在 Laravel 的根文件夹之外。我还复制了原始表单的 "action" 属性的值,以针对原始表单的路由。我是从浏览器的查看源码页面复制过来的

你的测试是正确的 - 但你的理解是错误的。

CSRF 的全部意义在于防止黑客在他们的页面上创建一个可以在您的页面上为 另一个 用户工作的表单。他们总是可以复制适用于 自己 的表单 - 因为他们知道自己的 CSRF 代码 - 但他们 永远不知道其他用户的 CSRF 代码

没有 CSRF:

CSRF 攻击的工作方式是您的网站具有 "transfer money" 的形式。攻击者将您的 "transfer money" 表单的伪造副本放在他的页面上。

如果用户 A 登录到您的网站并转到攻击者页面,攻击者可以诱使用户提交 "transfer money" 表单并向自己转移大量资金。

因为用户 A 已登录到您的网站,所以传输表单将起作用,因为他们有一个有效的会话。但是没有 CSRF 检查 - 所以黑客 'copied' 表单将适用于用户 A.

但是使用 CSRF:

攻击者从您的网站复制表单 - 但他们不知道用户 A 的 CSRF 代码。他们只知道自己的代码。他们基本上* 永远不会 得到那个代码。因此,当用户 A 在黑客页面上提交 'fake' "transfer money" 表单时 - 它会失败 - 因为黑客无法包含 CSRF 令牌,因为他们不知道它。

这是防止 CSRF 攻击的方法。