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

Php Laravel 4:防止多个表单提交-CSRF令牌,php,forms,csrf,laravel-4,post-redirect-get,Php,Forms,Csrf,Laravel 4,Post Redirect Get,问题场景: 我正在用Laravel 4创建一个博客。负责创建新博客帖子的表单由内置的CSRF保护()保护 到目前为止,一切正常,但似乎laravel并没有在每个请求上刷新csrf令牌 出现的问题是,如果用户点击浏览器的后退按钮返回到提交的表单,则输入的数据仍然存在,用户可以“重新提交”表单。这可能会为垃圾邮件发送者打开一扇大门 通常情况下,CSRF令牌会阻止这种情况,因为它会在每次请求时刷新,但Laravel似乎不会这样做 我使用laravel“资源控制器”方法()来处理表单和博客文章视图。此外

问题场景:

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

到目前为止,一切正常,但似乎laravel并没有在每个请求上刷新csrf令牌

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

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

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


于是出现了以下想法:

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

  • 生成另一个令牌并手动将其包含到表单中

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

  • 就我个人而言,我更喜欢第一个想法,但不幸的是,我找不到一种方法来强迫拉威尔按照我希望的方式行事,而不破坏“照明”本身(我希望保持“原样”,以便能够在没有“hasslehoff”^^的情况下更新拉威尔)

    你有什么推荐吗?


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

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

    1) 提交后生成新令牌:

    Session::put('u-token',sha1(microtime())

    2) 发布后重定向到确认页面:

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

    最后我做了第二个


    编辑:在通过Jason发表的评论中,最好将上述两种方法结合使用

    我刚刚检查了stackoverflow如何处理“history.back()”上的表单:在重新提交相同的数据时,它会说“一个标题为该标题的问题已经存在;请更具体一些。”以及“您只能每20分钟发布一次。”。是一个选项,但不是我真正想要的…我还使用Redirect::route在验证通过后重定向到创建的博客文章。如果出现验证错误,我将使用Redirect::back()->withInput()->withErrors()。顺便说一句:你是第一个回答我第一个问题的人:-)谢谢。我会投票支持你,但需要15个代表先…好了。。。我只是等待,因为可能会有更多的答案。@HalfCrazed我尝试了第二个选项,但对我无效。表单再次提交。那么CSRF令牌是否会在重定向时被销毁或自动重置,即在登录到非表单页面时?回答我的问题(我刚刚尝试了这个),不,重定向不会验证CRSF令牌。即使在重定向到“谢谢”页面后,用户也可以按下“后退”按钮,使用旧的CSRF令牌返回包含填充数据的完整表单。用户可以再次提交表单,而不会引发任何错误。因此,单靠自己是不足以解决这个问题的。它应与1)一起使用,以重置会话中的CSRF令牌。