编辑:我应该在一开始说,我正在使用AngularJS在前端,并通过XHR进行所有请求。我正在开发一个应用程序,为每个用户请求使用CSRF令牌。
每次请求后我是否应该重新生成令牌
?
类似于:
Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)
每个用户使用相同的会话
是否足够?
这样做有什么好处吗?
编辑:我应该在一开始说,我正在使用AngularJS在前端,并通过XHR进行所有请求。我正在开发一个应用程序,为每个用户请求使用CSRF令牌。
每次请求后我是否应该重新生成令牌
?
类似于:
Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)
每个用户使用相同的会话
是否足够?
这样做有什么好处吗?
使用Laravel 5的Blade模板,这很容易。
如果你只想要csrf令牌的值,可以通过编写以下代码生成:
{{ csrf_token() }}
生成的令牌值如下:
7YC0Sxth7AYe4RFSjzaPf2ygLCecJhPbyXhz6vvF
如果您正在使用表单,您可以在表单内添加以下代码行:{{ csrf_field() }}
这将生成像这样的 HTML:
<input type="hidden" name="_token" value="7YC0Sxth7AYe4RFSjzaPf2ygLCecJhblahblah">
Laravel应该已经为您处理了这个问题,您不需要管理_token
的创建/删除
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
请参阅此处文档中的“CSRF保护”部分:http://laravel.com/docs/security @csrf
CSRF token(跨站点请求伪造)通过比较cookie token和服务器token来防止跨站攻击。
您可以通过使用csrf_token()
助手函数在laravel中生成csrf token。如果您想要完整的csrf字段,则可以使用csrf_field()
函数,其内部逻辑是
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;
}
$CSRFToken = csrf_token();
易如反掌,希望能对您有所帮助