Установить флаг 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;
}
Другие вопросы по тегам