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

Posted

技术标签:

【中文标题】CSRF(跨站请求伪造)在 Laravel 中无法正常工作【英文标题】:CSRF (Cross Site Request Forgery) does not work as expected in Laravel 【发布时间】:2015-10-04 10:53:15 【问题描述】:

我正在使用“Laravel Code Bright”学习 Laravel。在本书的“表单安全”部分,它谈到了在使用Form::Open() 方法生成表单输入时,Laravel 如何生成秘密隐藏代码以防止“CSRF - 跨站点请求伪造”。

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

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

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

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

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

我使用的外部表单位于 Laravel 的根文件夹之外。我还复制了原始表单的“action”属性的值,以定位原始表单的路由。我从浏览器的查看源页面复制它。

【问题讨论】:

【参考方案1】:

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

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

没有 CSRF:

CSRF 攻击的工作方式是您的网站有一个“转账”表格。攻击者将您的“转账”表单的伪造副本放在他的页面上。

如果用户 A 登录您的网站并进入攻击者页面,攻击者可以诱骗用户提交“转账”表单并为自己转账大量资金。

由于用户 A 已登录到您的网站,因此转移表单将起作用,因为他们有一个有效的会话。但是没有 CSRF 检查 - 所以黑客“复制”的表格适用于用户 A。

但是使用 CSRF:

攻击者从您的网站复制表单 - 但他们不知道用户 A 的 CSRF 代码。他们只知道自己的代码。他们基本上可以*永远获得该代码。因此,当用户 A 在黑客页面上提交“假”“转账”表单时 - 它会失败 - 因为黑客无法包含 CSRF 令牌,因为他们不知道。

这是防止 CSRF 攻击的方法。

【讨论】:

不错的答案。 CSRF 保护是为了保护用户免受他人的侵害,而不是保护自己。如果他们想删除自己的自己的内容,他们可以。 CSRF 令牌仍然可以通过中间人攻击暴露,因此单独使用 CSRF 令牌并不能阻止 CSRF 攻击。 是的@nCrazed - 这是正确的。这就是为什么我放 basically* - 为了这个答案,我决定保持简单。也可以利用 XSS 漏洞获取 CSRF 令牌并以此方式发起攻击。 @nCrazed:MITM 通过使用 TLS/SSL(HTTPS URL)得到缓解。

以上是关于CSRF(跨站请求伪造)在 Laravel 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

HTTP层 —— CSRF保护

CSRF(跨站请求伪造)

CSRF跨站请求伪造

CSRF跨站请求伪造的安全防护

CSRF(跨站请求伪造)攻击

跨站请求伪造CSRF原理