CSRF Token
开发一个应用程序。
我应该在每次请求后重新生成Token
吗?
像
这样的东西Session::forget("_token") and Session::put("_token", RANDOM_SOMETHING)
或者每个用户使用相同的用户Session
吗?
有什么好处吗?
答案 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();
轻松自在 希望对您有帮助