Установить флаг httpOnly для токена CSRF в Laravel
Я создаю приложение в Laravel 5.1 для клиента. После того, как я закончил приложение, я получил отчет о пентесте, который говорит мне, чтобы добавить флаг HttpOnly. Я добавил 'secure' => true и 'http_only' => true в app/config/session.php. Флаг httpOnly устанавливается для всех сеансов, кроме сеанса XSRF-TOKEN. Как я могу установить этот флаг?
5 ответов
Вы можете перезаписать метод addCookieToResponse($request, $response) в App\Http\Middleware\VerifyCsrfToken
/**
* 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;
Вы должны использовать в .env
SESSION_DOMAIN=
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=strict
Это можно исправить. Если вам нужен только 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;
}
Для токена CSRF нет такой вещи, как флаг httpOnly, только для файлов cookie.
Нам нужна дополнительная информация, например, ошибка, которую вы получаете, или какой-то код, как вы устанавливаете токен CSRF и т. Д.
И что вы подразумеваете под сеансом XSRF-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'], true, false, $config['same_site'] ?? null
)
);
return $response;
}