Laravel CSRF令牌

时间:2014-04-05 05:47:58

标签: laravel csrf

编辑:我应该在开始时说过这个,我在FronEnd中使用AngularJS,并且我通过XHR发出了所有请求。 我正在为每个用户请求使用CSRF Token开发一个应用程序。

我应该在每次请求后重新生成Token吗?

这样的东西
Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)

或者每个用户使用相同的用户Session吗?

有什么好处吗?

6 个答案:

答案 0 :(得分:16)

Laravel 5使用Blades模板,非常简单。

如果您只想要csrf标记的值,可以通过编写:

来生成它
{{ csrf_token() }}

生成令牌值,如下所示:

7YC0Sxth7AYe4RFSjzaPf2ygLCecJhPbyXhz6vvF

如果您使用的是表单,可以在表单中添加以下代码行:

{{ csrf_field() }}

将生成如下的html:

<input type="hidden" name="_token" value="7YC0Sxth7AYe4RFSjzaPf2ygLCecJhblahblah">

答案 1 :(得分:6)

Laravel应该为您做这件事,您不需要管理_token的创建/删除

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

参见&#39; CSRF保护&#39;此处文档中的部分:http://laravel.com/docs/security

答案 2 :(得分:5)

取决于。如果攻击者不是MITM,在他们无法窃听您的Web应用程序和API服务器之间的流量的意义上,整个会话的单个CSRF令牌就足够了。

假设您也在服务器端保护敏感操作(即仅允许资源所有者访问资源,例如“删除我的帐户”等),令牌将确保发出请求的浏览器是合法的,经过身份验证的用户的浏览器。我认为这就是你应该担心的一切。

另一方面,如果攻击者能够查看Web应用程序与您的API之间的非安全流量,他们可能会获得CSRF令牌和您的session_id并透明地执行恶意内容。在这种情况下,为每个请求(POST或任何执行敏感操作的类型)授予,使用和随后丢弃令牌只会使他们的工作变得更加困难,但您仍然注定失败。

我的2美分......

答案 3 :(得分:4)

如果您使用的是Laravel 5.6,请在表单顶部执行以下操作,为CSRF令牌创建隐藏输入字段

[A-Z]

答案 4 :(得分:1)

  

CSRF令牌通过将Cookie令牌与   服务器令牌。

您可以通过csrf_token()辅助函数在laravel中生成csrf令牌。如果您想要完整的csrf字段,则可以使用csrf_field()函数,并且csrf内部逻辑是

function csrf_field()
{
   return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
}

当将产生新请求时,laravel每次都会创建随机令牌,并在存储后将其存储在浏览器cookie和会话中。它们相互比较,如cookie == session token

Laravel内部逻辑紧随其后,您可以在VerifyCsrfToken中间件中找到它。

/**
 * Determine if the session and input CSRF tokens match.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return bool
 */
protected function tokensMatch($request)
{
    $token = $this->getTokenFromRequest($request);

    return is_string($request->session()->token()) &&
           is_string($token) &&
           hash_equals($request->session()->token(), $token);
}

/**
 * Get the CSRF token from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 */
protected function getTokenFromRequest($request)
{
    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

    if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
        $token = $this->encrypter->decrypt($header);
    }

    return $token;
}

/**
 * Add the CSRF token to the response cookies.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Symfony\Component\HttpFoundation\Response  $response
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function addCookieToResponse($request, $response)
{
    $config = config('session');

    $response->headers->setCookie(
        new Cookie(
            'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
            $config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
        )
    );

    return $response;
}

答案 5 :(得分:1)

如果您想在控制器中获取CSRF令牌,则可以像这样使用它并重定向发布Route

$CSRFToken = csrf_token();

轻松自在 希望对您有帮助