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

时间:2013-06-21 16:01:11

标签: php forms csrf laravel-4 post-redirect-get

问题情景:

我正在使用Laravel 4创建一个博客。负责创建新博客帖子的表单受到CSRF保护(Laravel Docs: CSRF Protection)内置的保护。

到目前为止一切正常,但似乎laravel不会在每次请求时刷新csrf令牌。

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

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

我使用laravel“资源控制器”方法(Laravel Docs: Resource Controllers)来处理表单和博客帖子视图。此外,在将提交的输入存储在数据库(MySQL)中之前,我使用Laravels输入验证器。


所以出现了以下想法:

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

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

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

  4. 就我个人而言,我更喜欢第一个想法,但遗憾的是我无法找到一种强迫laravel表现我想要的方式,而不会破坏“Illuminate”本身(我想保持“原样”)能够在没有“麻烦 hoff ”的情况下更新laravel。

    您会推荐什么?

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

1 个答案:

答案 0 :(得分:18)

我实际上遇到了这个问题以及多个帖子提交。你有两个选择:

1)提交后提交新令牌:

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

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

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

我最后做了第二次。

编辑:在Jason的评论中,最好使用上述两种方法的组合