Редактирование заголовка .htaccess set-cookie не работает с laravel

Моему проекту нужно запустить тест безопасности, запрошенный клиентом.

Я использую OWASP ZAP для запуска теста.

и он вернет предупреждение cookie No HttpOnly Flag, и это произошло из-за того, что файл cookie «X-XSRF TOKEN» не установил флаг httponly.

Я провел некоторое исследование и знаю, что этот файл cookie не устанавливает httponly для библиотек javascript, таких как axios, для его использования.

но я использую laravel 5.5, и в начальном проекте есть отличный механизм, позволяющий библиотеке javascript получать этот токен без непосредственного использования cookie с помощью мета-флага:

......

// layout.blade.php 
 <!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">

......

и в index.js:

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

поэтому он должен работать нормально, даже если для флага XSRF-TOKEN httponly установлено значение true.

Я отслеживаю исходный код и понимаю, что могу изменить всего одну строку, чтобы он заработал. и кто-то уже открыл пров на гитхабе для решения этого вопроса:

https://github.com/ametad/framework/commit/2241b020ae3001ce5dabc1b7c5ea1514ff7f2e33# public/.httaccess <ifModule mod_headers.c> Header always edit Set-Cookie: (.*) "$1, httponly" Header set X-Content-Type-Options nosniff Header always append X-Frame-Options SAMEORIGIN Header set X-XSS-Protection "1; mode=block" </ifModule>

но Header always edit Set-Cookie: (.*) "$1, httponly" у меня не сработало. ниже этой строки все работает, просто set-cookie не работает.

есть идеи, как решить эту проблему?


person Shin Li    schedule 04.10.2019    source источник


Ответы (1)


Во-первых, обычно не обязательно, чтобы XSRF-TOKEN был только http. Этот файл cookie зашифрован (все файлы cookie Laravel зашифрованы), поэтому, даже если клиент получает к нему доступ, на самом деле он не содержит никакой полезной информации.

Вы можете переопределить промежуточное ПО VerifyCsrfToken по умолчанию своим собственным:


namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {
    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'], $config['http_only'], false, $config['same_site'] ?? null
            )
        );
        return $response;
    }

}

Затем вы можете заменить фреймворк VerifyCsrfToken в Http/Kernel.php своим собственным переопределенным.

Недостатком этого является то, что когда вы обновляете свою версию Laravel, вам нужно будет убедиться, что ваш переопределенный класс по-прежнему будет совместим с базовым классом.

person apokryfos    schedule 04.10.2019
comment
Я получил это, и это отличное решение, мне не нужно изменять исходный код laravel. - person Shin Li; 04.10.2019
comment
Я не слишком хорошо знаком с изменением файлов cookie в .htaccess, но обычно с apache это обычно сводится либо к отключенным модулям, либо к синтаксическим причудам. - person apokryfos; 04.10.2019