问题情景:
我正在使用Laravel 4创建一个博客。负责创建新博客帖子的表单受到CSRF保护(Laravel Docs: CSRF Protection)内置的保护。
到目前为止一切正常,但似乎laravel不会在每次请求时刷新csrf令牌。
出现的问题是,如果用户点击浏览器的后退按钮返回提交的表单,则输入的数据仍然存在,用户可以“重新提交”表单。这可能会为垃圾邮件发送者打开一扇门。
通常这会被CSRF令牌阻止,因为它会在每次请求时刷新,但是Laravel似乎不会这样做。
我使用laravel“资源控制器”方法(Laravel Docs: Resource Controllers)来处理表单和博客帖子视图。此外,在将提交的输入存储在数据库(MySQL)中之前,我使用Laravels输入验证器。
所以出现了以下想法:
以某种方式强制Laravel 4在每次请求时自动重新生成csrf
生成另一个令牌并手动将其包含在表单中
在用户会话(php或数据库)中保存表单子目录的时间戳,并在时基上限制新表单提交
就我个人而言,我更喜欢第一个想法,但遗憾的是我无法找到一种强迫laravel表现我想要的方式,而不会破坏“Illuminate”本身(我想保持“原样”)能够在没有“麻烦 hoff ”的情况下更新laravel。
您会推荐什么?
你是如何自己处理这个问题的?
答案 0 :(得分:18)
我实际上遇到了这个问题以及多个帖子提交。你有两个选择:
1)提交后提交新令牌:
Session::put('_token', sha1(microtime()))
2)将帖子重定向到确认页面:
Redirect::route('form/success')->with("data", $myData)
我最后做了第二次。
编辑:在Jason的评论中,最好使用上述两种方法的组合