9

我实际上是在玩 Laravel 4。现在我在表单发布上实现了 CSRF 令牌安全性。

问题是,从会话中生成的令牌始终相同的意义上说,这实际上不起作用,Session::token()因此当我尝试重新提交表单甚至从另一台服务器发布表单时,安全检查不起作用Session::token() != Input::get('_token')(过滤器.php)

有人已经遇到过这个问题吗?

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

4

4 回答 4

9

提交表单后,在处理完表单后,您应该更改 CSRF 令牌,Session::put('_token', md5(microtime()));这样可以防止表单重新提交。有关更多信息,您可以查看thisthis

于 2013-08-23T10:02:50.283 回答
3

我在 app/filter.php 中以这种方式使用内置的 regenerateToken 函数:

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('_token') ,如下所示:

return Redirect::route('routename')->withInput(Input::except('_token'));
于 2014-05-25T10:32:50.063 回答
1

在表单中,您必须像这样创建令牌:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

之后,令牌将与输入一起发送。因此,当您收到输入时,您必须像这样检查令牌:

Route::post('register', array('before' => 'csrf', function()
{
    return 'You gave a valid CSRF token!';
}));

这样,您将在访问路由之前放置一个过滤器来检查 CSRF 令牌。

从这里的 Laravel 文档中得到这个

于 2013-08-22T13:53:45.207 回答
0

当您使用 Blade 创建表单时,_token 会自动呈现在表单内

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?>
...
HTML
...
 <?php echo Form::close() ?>
于 2015-04-17T23:17:56.143 回答