我正在使用"Laravel“学习Laravel。在本书的“表单安全性”一节中,它讨论了在使用Form::Open()方法生成表单输入时,Laravel如何生成秘密隐藏代码以防止"CSRF -跨站点请求伪造“。
我尝试了一个示例来访问将使用外部表单处理表单的路由。首先,我没有“之前,”“=>”csrf“过滤器附加到路由,我得到了我期待的答案,即外部形式能够访问路由。
对于第二个测试,我在“=>”csrf“过滤器”之前向路由添加了“”。当我单击外部表单的submit按钮时,页面持续加载了很长时间,并且没有显示任何结果就放弃了,页面是空白的。这意味着“”之前的“=>”csrf过滤器阻止了这个外部表单访问路由。
在第三个测试中,我复制了原始表单的隐藏令牌(通过查看浏览器的源代码页)并将其添加到外部表单中,然后再次尝试,然后单击submit按钮,这个外部表单给我的结果与第一个测试相同,也就是说它显示了结果,这意味着它能够通过我从原始表单添加的隐藏令牌访问路由。
我的理解是,如果您向表单中添加了一个隐藏令牌以防止"CSRF“,并且攻击者查看浏览器的源页并复制隐藏令牌并将其添加到表单中,他仍然可以针对您的路由进行攻击,因为隐藏令牌将始终在浏览器的查看源页中可见。
我的问题是,是否有更好的方法来防止"CSRF“,即使攻击者复制隐藏令牌并添加到他的表单中?
要使用的外部表单在Laravel的根文件夹之外。我还复制原始表单的"action“属性的值,以便以原始表单的路径为目标。我从浏览器的查看源页面复制它。
发布于 2015-07-15 13:39:18
你的测试是正确的,但你的理解是错误的。
CSRF的全部目的是防止黑客在其页面上为另一个用户创建一个在您的页面上工作的表单。他们总是可以复制一个适用于自己的的表单--因为他们知道自己的CSRF代码--但是他们可以永远不认识其他用户CSRF代码。
没有CSRF的:
CSRF攻击的工作方式是你的网站有一个“转移资金”的形式。攻击者在他的页面上放了你的“转账”表格的假副本。
如果用户A登录到您的网站,并进入攻击者页面,攻击者可以欺骗用户提交“转帐”表单,并将大量资金转移给自己。
因为用户A登录到您的网站,传输表单将工作,因为他们有一个有效的会话。但是没有CSRF检查,所以黑客复制的表单将对用户A有效。
但使用CSRF:
攻击者从您的网站复制表单--但是他们不知道用户A的CSRF代码。他们只知道他们自己的代码。他们基本上可以*永远不会得到那个代码。因此,当用户A在黑客页面上提交‘假’“转移资金”表单时,它将失败--因为黑客无法包含CSRF令牌,因为他们不知道。
这就是防止CSRF攻击的方法。
https://stackoverflow.com/questions/31429723
复制相似问题