问题场景:
我正在使用 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
生成另一个标记并手动将其包含到表单中
在用户 session (php 或数据库)中保存表单提交的时间戳,并按时间限制新表单提交
就我个人而言,我更喜欢第一个想法,但不幸的是,我无法找到一种方法来强制 Laravel 以我想要的方式表现,而无需破解“Illuminate”本身(我想保持“原样”能够在没有“麻烦hoff”的情况下更新 laravel ^^)。
您会推荐什么?
您自己是如何处理这个问题的?
最佳答案
我实际上也遇到了这个问题以及多个帖子提交。您在这里有两个选择:
1) 提交后生成一个新 token :
Session::put('_token', sha1(microtime()))
2) 发帖后重定向到确认页面:
Redirect::route('form/success')->with("data", $myData)
我最后做了第二个。
编辑:在 Jason 的评论中,最好结合使用上述两种方法
关于php - 拉维尔 4 : Prevent multiple form submissions - CSRF Token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17239586/