5

问题场景:

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

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

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

通常这是由 CSRF 令牌阻止的,因为它在每个请求上都会刷新,但 Laravel 似乎并没有那样做。

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


于是产生了以下想法:

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

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

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

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

你会推荐什么?

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

4

1 回答 1

20

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

1)在提交后生成一个新的令牌:

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

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

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

我最终做了第二个。

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

于 2013-06-21T20:47:39.300 回答