为什么Laravel 4 CSRF令牌不工作?

为什么Laravel 4 CSRF令牌不工作?,laravel,token,csrf,Laravel,Token,Csrf,我其实是在和拉威尔4玩。现在我在form post上实现了CSRF令牌安全性 问题是,在会话session::token()中生成的令牌始终相同的情况下,这实际上不起作用,因此当我尝试重新提交表单,甚至从另一台服务器发布表单时,安全检查不起作用session::token()Input::get(“U标记”)(filters.php) 有人已经面临这个问题了吗 编辑: 好的,我找到了解释。每个机器/会话的令牌实际上是不同的。现在更有意义了:) 感谢所有人的帮助在表单中,您必须创建如下令牌: re

我其实是在和拉威尔4玩。现在我在form post上实现了CSRF令牌安全性

问题是,在会话
session::token()
中生成的令牌始终相同的情况下,这实际上不起作用,因此当我尝试重新提交表单,甚至从另一台服务器发布表单时,安全检查不起作用
session::token()Input::get(“U标记”)
(filters.php)

有人已经面临这个问题了吗

编辑:
好的,我找到了解释。每个机器/会话的令牌实际上是不同的。现在更有意义了:)
感谢所有人的帮助

在表单中,您必须创建如下令牌:

return Redirect::route('routename')->withInput(Input::except('_token'));

提交表单时,在处理表单后,您应该更改CSRF令牌,如
会话::put(“_token”,md5(microtime())这将防止表单重新提交。。有关更多信息,请参见,我在我的app/filter.php中以这种方式使用内置的Regeneratoken函数:

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        Session::regenerateToken();
        return *Redirect / Exception*
    }
    Session::regenerateToken();
});
使用输入重定向时的另一个注意事项

在laravel 4中,当您以以下方式使用{{Form::open(…)}时,将生成令牌:

public function token()
{
    return $this->hidden('_token', $this->csrfToken);
}
因此,它使用一个隐藏的输入,如果存在,它将从input::old函数中设置其值

为了防止出现这种情况,如果您不想使用已经过时的令牌创建表单,则需要使用Input::except(“U令牌”):

return Redirect::route('routename')->withInput(Input::except('_token'));

使用Blade创建表单时,_标记会在表单内部自动呈现

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?>
...
HTML
...
 <?php echo Form::close() ?>

...
HTML
...

谢谢您的回答。我做了所有这些,但我的问题是关于令牌本身,它没有更新。即使我刷新页面,令牌仍然是相同的,因此过滤器将始终返回true。谢谢您的回答。事实上,到目前为止,这是唯一可行的方法,但我认为,如果我们仍然需要关注这些细节,那么给开发人员一个csrf令牌安全检查是非常愚蠢的。这应该是开箱即用的:(再次感谢Wow。我刚刚测试了它,并多次获得相同的令牌。你必须想知道他们认为CSRF令牌的意义是什么……我想知道它是否在5中修复。