【发布时间】:2015-10-04 10:53:15
【问题描述】:
我正在使用“Laravel Code Bright”学习 Laravel。在本书的“表单安全”部分,它谈到了在使用Form::Open() 方法生成表单输入时,Laravel 如何生成秘密隐藏代码以防止“CSRF - 跨站点请求伪造”。
我尝试了一个示例来访问将使用外部表单处理表单的路由。首先,我在没有附加到路由的 "before"=>"csrf" 过滤器 的情况下做到了,我得到了我期望的答案,即外部表单能够访问路由。
对于第二个测试,我在路由中添加了 "before"=>"csrf" 过滤器。当我点击外部表单的提交按钮时,页面一直加载很长时间,它没有显示任何结果就放弃了,页面是空白的。这意味着 "before"=>"csrf" 过滤器阻止了这个外部表单访问路由。
对于我的第三次测试,我复制了原始表单的隐藏标记(通过查看浏览器的源代码页)并将其添加到外部表单并再次尝试,通过单击提交按钮,这个外部表单给了我与第一个测试的结果相同,即它显示的结果意味着它能够通过我从原始表单添加的隐藏令牌访问路由。
我的理解是,如果您在表单中添加隐藏令牌以防止“CSRF”并且攻击者查看浏览器的源页面并复制隐藏令牌并将其添加到他的表单中,他仍然可以针对您的路线,因为隐藏令牌将始终在浏览器的查看源页面中可见。
我的问题是,即使攻击者复制隐藏令牌并添加到他的表单中,是否有更好的方法来防止“CSRF”?
我使用的外部表单位于 Laravel 的根文件夹之外。我还复制了原始表单的“action”属性的值,以定位原始表单的路由。我从浏览器的查看源页面复制它。
【问题讨论】:
标签: php laravel laravel-4 laravel-5 csrf