Моему проекту нужно запустить тест безопасности, запрошенный клиентом.
Я использую 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
но я не могу изменять исходный код фреймворка, поэтому я пытаюсь изменить заголовок файла 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 не работает.
есть идеи, как решить эту проблему?