我正在为客户在 Laravel 5.1 中构建一个应用程序。完成应用程序后,我收到了一份渗透测试报告,它告诉我添加一个 HttpOnly 标志。 我将 'secure' => true 和 'http_only' => true 添加到 app/config/session.php 中。为除 XSRF-TOKEN 会话之外的所有会话设置 httpOnly 标志。我怎样才能设置这个标志?
您可以在 App\Http\Middleware\VerifyCsrfToken 中覆盖方法 addCookieToResponse($request, $response)
/**
* Add the CSRF token to the response cookies.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Http\Response $response
* @return \Illuminate\Http\Response
*/
protected function addCookieToResponse($request, $response)
{
$response->headers->setCookie(
new Cookie('XSRF-TOKEN',
$request->session()->token(),
time() + 60 * 120,
'/',
null,
config('session.secure'),
false)
);
return $response;
}
不要忘记添加
use Symfony\Component\HttpFoundation\Cookie;
这个问题可以修复。如果您只需要 http 作为令牌,请将其添加到VerifyCsrfToken 中间件:
/**
* 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'], true, false, $config['same_site'] ?? null
)
);
return $response;
}
必须在.env中使用
SESSION_DOMAIN=
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=strict
/**
将 CSRF 令牌添加到响应 cookie。
@param \Illuminate\Http\Request $request
@param \Symfony\Component\HttpFoundation\Response $response
@return \Symfony\Component\HttpFoundation\Response */ 受保护函数 addCookieToResponse($request, $response) { $config = config('会话');
$响应->标题->setCookie( 新的 Cookie( 'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']), $config['path'], $config['domain'], $config['secure'], true, false, $config['same_site'] ??无效的 ) );
返回$响应; }
完美!