Добавление флагов Secure и httpOnly к каждому ответу Set-Cookie в Apache httpd

Я использую Apache 2.2.26:

Server version: Apache/2.2.26 (Unix)
Server built:   Jan 17 2014 12:24:49
Cpanel::Easy::Apache v3.22.30 rev9999 +cloudlinux

Я пытаюсь использовать mod_headers для редактирования заголовков Set-Cookie и добавления флага secure или httpOnly, но он вообще не работает (ничего не делает, не выдает ошибку HTTP 500).

Я могу без проблем использовать директивы "изменить" "добавить" команды заголовка, но не редактировать. Я не знаю, почему...

Я пробовал много комбинаций, но вот что у меня есть в моем .htaccess:

Header edit Set-Cookie "(.)([Hh][Tt][Tt][Pp][Oo][Nn][Ll][Yy])?(.)" "$1$2 ;HTTPOnly"
Header edit Set-Cookie "(.)([Ss][Ee][Cc][Uu][Rr][Ee])?(.)" "$1$2 ;Secure"

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


person Doug    schedule 09.06.2014    source источник
comment
Я мог найти ответ, но не совсем понимаю, о чем они говорят: http://apache-http-server.18135.x6.nabble.com/Mark-cookies-as-secure-td5003557.html Файл cookie создает файл cookie, который может быть настроен как CGI, я не уверен.   -  person Doug    schedule 10.06.2014
comment
serverfault.com/questions/235713/?   -  person ax.    schedule 13.06.2014
comment
Я видел это, но проблема была в Apache 2.2.3, а правка была добавлена ​​в 2.2.4. Я использую Apache 2.2.26 ... поэтому, если нет способа удалить редактирование, я бы подумал, что он будет там. Я полагаю, что это старая версия mod_headers, а не старая версия Apache? Придется в это вникнуть.   -  person Doug    schedule 13.06.2014


Ответы (5)


Директива Header edit запускается до того, как ваше приложение выдаст ответ, поэтому, если приложение создает заголовок, который вы хотите отредактировать, этот заголовок еще не будет существовать во время выполнения директивы, и будет нечего ему редактировать.

Вы можете исправить это, используя вместо этого Header always edit (который запускается после того, как ваше приложение выдаст ответ):

Header always edit Set-Cookie (.*) "$1; HTTPOnly"

Пример заголовка перед применением директивы:

Set-Cookie: foo=bar; domain=.example.com; path=/

Тот же заголовок после применения директивы:

Set-Cookie: foo=bar; domain=.example.com; path=/; HTTPOnly

Я не уверен, что именно должны делать директивы в вашем вопросе; к чему они на самом деле приводят при изменении на Header always edit (при условии того же заголовка Set-Cookie, что и в моем примере выше), например

Set-Cookie: f ;HTTPOnlyo=bar; domain=.example.com; path=/

Если вы понимаете, как работают регулярные выражения и обратные ссылки, то, что там происходит, очевидно, но, по-видимому, это не то, что вам нужно. Директива, которую я дал в начале этого ответа, должна работать на вас, если, как вы говорите, вы хотите добавить флаг к каждому заголовку Set-Cookie; если ваши потребности более сложные, и я неправильно понял, что вы пытаетесь сделать с этим поиском / заменой, дайте мне знать.

РЕДАКТИРОВАТЬ: Если это неочевидно: чтобы добавить оба флага, вы можете изменить директиву следующим образом:

Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"

... или используйте две директивы:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header always edit Set-Cookie (.*) "$1; Secure"

Первый подход мне кажется более разумным, но это во многом дело вкуса.

person Zero Piraeus    schedule 16.06.2014
comment
Привет, я пробую этот заголовок всегда редактировать Set-Cookie (. *) $ 1; HTTPOnly; Безопасный подход на Apache 2.4.6, но, похоже, он не работает - person NullEins; 29.08.2018
comment
@NullEins Важно отметить, что для работы Secure потребуется HTTPS. Если вы используете Secure на HTTP, cookie не будет работать. - person Jeremy; 27.09.2018
comment
Посмотрим, правильно ли я понял. Внутри моего htacess я добавляю эту строчку Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"? У меня много ошибок prnt.sc/pehmj8 - person Tiago; 03.10.2019
comment
Большое спасибо за это решение. Работает отлично. Для тех, кто ищет решение применить на всем сайте, но исключить определенные файлы cookie, прочтите здесь: https://stackoverflow.com/questions/41173890/edit-cookie-httponly-value - person Ivan; 25.10.2019
comment
как я могу отредактировать заголовок Set-Cookie только для определенного файла cookie, т.е. я просто хочу добавить HttpOnly, Secure для имени файла cookie _jsessionid? - person Olivier Boissé; 19.12.2019
comment
Я пробовал, но, как вы можете видеть, не отмечал, например, файл cookie JessionID. Что случилось? См. ibb.co/tPtQhJb. - person André Luís Oliveira; 03.07.2020
comment
Если ваша директива Header always edit не применяется к определенному заголовку, взгляните на только что оставленный мной ответ. Вы, вероятно (тоже) хотите Header onsuccess edit. - person Coderer; 28.05.2021

Я пытался установить http, secure и samesite = strict для файлов cookie.

Это сработало для меня:

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

Samesite = strict обеспечивает защиту от XSRF.

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict

Надеюсь, это поможет.

person Sahith Vibudhi    schedule 20.03.2019
comment
Посмотрим, правильно ли я понял. Внутри моего htacess я добавляю эту строчку Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict? У меня много ошибок prnt.sc/pehmj8 - person Tiago; 03.10.2019

Это добавит тег только к тем файлам cookie, которые в нем нуждаются:

Header always edit Set-Cookie "^((?!;\s?[Ss]ecure).)+$" "$0; Secure"
person Chagrin    schedule 06.03.2020

убедитесь, что mod_headers.so включен, затем добавьте следующий заголовок в apache2.conf для системы на основе debian или httpd.conf для системы на основе rpm

 Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

Для версий ниже, чем Apache 2.2.4, используйте следующее:

Header set Set-Cookie HttpOnly;Secure 

затем перезапустите сервер

person Sanjoy Kanrar    schedule 09.07.2019

Шесть лет спустя я, возможно, решил это.

Директива Header предоставляется mod_headers и имеет следующую структуру: Header {condition} {action} {header name} {match} {replacement}. Ключ, который я не видел, чтобы кто-нибудь упоминал в других ответах, - это первая переменная condition.

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

always не является расширением onsuccess по отношению к существующим заголовкам

В частности, есть две таблицы заголовков, которые вызываются always и onsuccess, и данный модуль может помещать значение в одну или обе из них, и все значения из обеих таблиц будут записаны в ответ.

TL; DR: всегда обязательно редактируйте заголовки в обеих таблицах:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header onsuccess edit Set-Cookie (.*) "$1; HTTPOnly"
person Coderer    schedule 28.05.2021