set-cookie для редактирования заголовка .htaccess не работает с laravel - PullRequest
0 голосов
/ 04 октября 2019

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

Я использую 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() }}">

......

и в индексе. 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 s httponly установлен флаг true.

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

https://github.com/ametad/framework/commit/2241b020ae3001ce5dabc1b7c5ea1514ff7f2e33

но я не стесняюсь изменять исходный код фреймворка, поэтому япопробуйте изменить заголовок cookie через сервер apache (public/.httaccess)

# 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 не работает.

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

1 Ответ

0 голосов
/ 04 октября 2019

Во-первых, обычно нет необходимости иметь 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 вам нужно будет убедиться, что ваш переопределенный класс все еще будет совместим с базовым классом.

...