问题场景:

我正在使用Laravel 4创建博客。负责创建新博客帖子的表单由CSRF保护(Laravel Docs: CSRF Protection)的内部版本保护。

到目前为止,一切工作正常,但是laravel似乎并未在每个请求上刷新csrf token 。

发生的问题是,如果用户单击浏览器的后退按钮以返回到提交的表单,则输入的数据将保持不变,并且用户能够“重新提交”该表单。这可能会为垃圾邮件发送者敞开大门。

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

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

因此,出现了以下想法:

  • 以某种方式强制Laravel 4在每个请求上自动重新生成csrf
  • 生成另一个 token ,并将其手动包含在表单中
  • 在用户 session (php或数据库)中保存表单提交的时间戳,并在时基
  • 上限制新表单的提交

    就我个人而言,我更喜欢第一个想法,但是不幸的是,我没有找到一种方法来强制laravel表现我想要的样子,而无需修改“Illuminate”本身(我想保持“原样”以便能够更新)不带“hasslehoff”的laravel ^^)。

    您会推荐什么?

    您如何亲自处理问题?

    最佳答案

    实际上,对于多个帖子提交,我也遇到了这个问题。您在这里有两个选择:

    1)在提交后生成一个新的 token :
    Session::put('_token', sha1(microtime()))
    2)将发布后的邮件重定向到确认页面:
    Redirect::route('form/success')->with("data", $myData)
    我结束了第二次。

    编辑:在通过杰森的评论中,最好使用上面概述的两种方法的组合

    09-30 17:09
    查看更多