Laravel 4:防止多个表单提交-CSRF令牌


Laravel 4: Prevent multiple form submissions - CSRF Token

问题场景:

我正在用Laravel 4创建一个博客。负责创建新博客文章的表单由内置的CSRF保护(Laravel Docs:CSRF保护)保护。

到目前为止,一切都很好,但似乎laravel并没有在每次请求时刷新csrf令牌。

出现的问题是,如果用户点击浏览器的后退按钮返回提交的表单,则输入的数据将持续存在,用户可以"重新提交"表单。这可能会为垃圾邮件发送者打开一扇大门。

通常这是由CSRF令牌阻止的,因为它在每次请求时都会被刷新,但Laravel似乎并不是这样做的。

我使用laravel"资源控制器"方法(LaravelDocs:ResourceControllers)来处理表单和博客文章视图。此外,在将提交的输入存储在数据库(MySQL)中之前,我使用Laravels输入验证器。


于是出现了以下想法:

  1. 以某种方式迫使Laravel 4在每次请求时自动重新生成csrf

  2. 生成另一个令牌并将其手动包含在表单中

  3. 在用户会话(php或数据库)中保存表单提交的时间戳,并在时间基础上限制新表单提交

就我个人而言,我更喜欢第一个想法,但不幸的是,我找不到一种方法来强迫laravel按照我想要的方式行事,而不攻击"Illuminate"本身(我想保持"原样",以便能够在没有"麻烦hoff"^^的情况下更新laravel)。

你推荐什么

你自己是如何处理这个问题的

实际上,我在提交多篇帖子时也遇到了这个问题。这里有两个选项:

1) 提交后生成新令牌:

Session::put('_token', sha1(microtime()))

2) 重定向AFTER帖子到确认页面:

Redirect::route('form/success')->with("data", $myData)

我最后做了第二个。

编辑:在Jason的评论中,最好使用上面列出的

这两种方法的组合