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