Назад | Перейти на главную страницу

HttpOnly и безопасные файлы cookie с Apache mod_header для всех файлов cookie

Я использую Apache 2.2.29 для веб-сайта. Apache работает как для обслуживания страниц из Drupal, так и как обратный прокси-сервер для внутреннего сервера приложений. По соображениям безопасности мы хотим добавить флаги HttpOnly и secure для всех файлов cookie, отправляемых клиентам. Для этого я установил следующие правила в apache

Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"

И это нормально работает для некоторых файлов cookie, но другие не изменяются. Глядя на заголовок ответа, я вижу следующее:

HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 22:50:01 GMT
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 20 Nov 2014 22:50:01 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Set-Cookie: SESSbfb02014bca2e49545c2cacd8a8cfcfa=perqn1l3mn2saselmabnn4vla7; expires=Sun, 14-Dec-2014 02:23:21 GMT; path=/; domain=.www6.server.com; HttpOnly; secure
Set-Cookie: textsize=100; expires=Fri, 20-Nov-2015 22:50:02 GMT; path=/; HttpOnly; secure
X-Cnection: close
Content-Type: text/html; charset=utf-8
Set-Cookie: TS01bd748d=015ca10fb56fc0a5579c6ad014a58a39be63cd86225d41d272c4e99ff818001921bf8a6afe8ff8786edc26a530281a2446ac250c26; Path=/
Set-Cookie: TS01ccb021=015ca10fb57273008302fba8649a42c6cd81f3c49f372d5d34fa4c31fc345f6be3c40dff1b5db114bd54174903e671f755744110dd; path=/; domain=.server.com
Set-Cookie: TS01bd748d_28=01d8892cb5da9e13891c7af98cab63f3bea0d8549b995c92d87d9b10240fcf906df41411935b1d5db889e1e5178debe05972be3916; Path=/
Content-Length: 39891

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Только первые два куки изменяются, чтобы иметь флаги. Остальные три - нет. Кажется, они устанавливаются позже или, по крайней мере, появляются после первых двух. Я не знаю, почему это имеет значение, но, кажется, имеет значение. Есть предложения, как их исправить?

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

Согласно документации:

Header [состояние] set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]

Необязательный состояние Аргумент определяет, с какой внутренней таблицей заголовков ответов будет работать эта директива. Другие компоненты сервера могли сохранить свои заголовки ответов в таблице, соответствующей onsuccess или таблица, которая соответствует всегда. "Always" в этом контексте относится к тому, будут ли добавленные вами заголовки отправляться как при успешном, так и при неудачном ответе, но если ваше действие является функцией существующего заголовка, вам придется читать дальше, чтобы узнать о дальнейших сложностях.

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

  • Вы добавляете заголовок к неуспешному (не 2xx) ответу, например к перенаправлению, и в этом случае в окончательном ответе используется только таблица, соответствующая always.
  • Вы изменяете или удаляете заголовок, созданный сценарием CGI, и в этом случае сценарии CGI находятся в таблице, соответствующей всегда
    а не в таблице по умолчанию.
  • Вы изменяете или удаляете заголовок, сгенерированный некоторой частью сервера, но этот заголовок не обнаруживается условием при успешном завершении по умолчанию.

ССЫЛКА: http://httpd.apache.org/docs/2.2/mod/mod_headers.html

Вы можете исправить это, используя Header always edit.

Например.

Header always edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header always edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"

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