Эффективное игнорирование списка файлов cookie в настройке обратного прокси-сервера NGINX - PullRequest
8 голосов
/ 11 июля 2019

В настоящее время я работаю / тестирую функцию микрокэша в настройке обратного прокси-сервера NGINX для динамического содержимого.

Одна большая проблема, которая возникает, это сеансы / файлы cookie, которые необходимо игнорировать, в противном случае пользователи будут входить в систему со случайными учетными записями на сайтах.

В настоящее время я игнорирую популярные файлы CMS, например:

if ($http_cookie ~* "(joomla_[a-zA-Z0-9_]+|userID|wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|sid_customer_|sid_admin_|PrestaShop-[a-zA-Z0-9]+") 
    {

# set ignore variable to 1
# later used in:
# proxy_no_cache                 $IGNORE_VARIABLE;
# proxy_cache_bypass             $IGNORE_VARIABLE;
# makes sense ?

    }

Однако это становится проблемой, если я хочу добавить больше файлов cookie в список игнорируемых. Не говоря уже о том, что использование слишком большого количества операторов if в NGINX не рекомендуется согласно документации.

Мои вопросы: можно ли это сделать с помощью метода карты? Я видел, что регулярное выражение в карте отличается (или, возможно, я ошибаюсь).

Или есть другой способ эффективного игнорирования / обхода файлов cookie?

У меня много поисков по stackoverflow, и хотя есть так много разных примеров; Я не смог найти что-то конкретное для своих нужд.

Спасибо

Обновление:

Много чтения и «копания» в интернете (мы могли бы просто сказать, что Google), и я нашел довольно интересные примеры.

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

Пример 1:

map $http_cookie $cache_uid {
  default nil;
  ~SESS[[:alnum:]]+=(?<session_id>[[:alnum:]]+) $session_id;
}
  1. В этом примере я могу заметить, что регулярное выражение сильно отличается от те, которые используются в блоках "если". Я не понимаю, почему картина начинается без "" и напрямую с помощью знака ~ .

  2. Я не понимаю, что означает [[: alnum:]] + ? Я ищу это но я не смог найти документацию. (или, может быть, я пропустил это)

  3. Я вижу, что автор устанавливал "nil" по умолчанию, это будет не относится к моему делу.

Пример 2:

map $http_cookie $cache_uid {
  default  '';
  ~SESS[[:alnum:]]+=(?<session_id>[[:graph:]]+)  $session_id;
}
  1. Те же точки, что и в примере 1, но на этот раз я вижу [[: graph:]] + . Что это?

Мой пример (не тестировался):

map $http_cookie $bypass_cache {

    "~*wordpress_(?!test_)[a-zA-Z0-9_]+"  1;
    "~*wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+"  1;
    "~*comment_author_[a-zA-Z0-9_]+"  1;
    "~*[a-zA-Z0-9]+_session)"  1;

    default      0;
}

В моем псевдо-примере регулярное выражение должно быть неверным, поскольку я не нашел примеров файлов cookie с таким регулярным выражением.

Итак, еще раз моя цель - создать список файлов cookie в стиле карты, для которых я могу обойти кеш, с правильным регулярным выражением.

Любые советы / примеры очень ценятся.

Ответы [ 2 ]

4 голосов
/ 15 июля 2019

Что именно вы пытаетесь сделать?

То, как вы делаете это, пытаясь внести в черный список только определенные файлы cookie из кэшированных через if ($http_cookie …, является неправильным подходом - это означает, что одинВ один прекрасный день кто-то найдет файл cookie, который не занесен в черный список и который, тем не менее, примет ваш бэкэнд, и приведет к отравлению кэша или другим проблемам с безопасностью.

Нет также причины использовать *Подход 1007 * также позволяет получить значения отдельных файлов cookie - все это уже доступно через парадигму http://nginx.org/r/$cookie_, что делает код map для анализа $http_cookie довольно избыточным и ненужным.

Существуют ли какие-либо файлы cookie, которые вы действительно хотите кэшировать?Если нет, то почему бы просто не использовать proxy_no_cache $http_cookie;, чтобы запретить кэширование при наличии каких-либо файлов cookie?


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

Например, лучшим подходом будет выяснение того, какие URL-адреса всегда должны кэшироваться, с очисткой заголовка Cookie, чтобы гарантировать, чтоотравление кэша невозможно (proxy_set_header Cookie "";).Иначе, если присутствуют какие-либо файлы cookie, может иметь смысл вообще ничего не кэшировать (proxy_no_cache $http_cookie;) или структурировать кэш так, чтобы в этом случае для http://nginx.org/r/proxy_cache_key; использовалась определенная комбинация учетных данных аутентификации,также может иметь смысл восстановить заголовок запроса Cookie вручную с помощью подхода, основанного на белом списке, чтобы избежать проблем с отравлением кэша.

1 голос
/ 13 июля 2019

Ваш второй пример, который у вас есть, это то, что вам действительно нужно

map $http_cookie $bypass_cache {

    "~*wordpress_(?!test_)[a-zA-Z0-9_]+"  1;
    "~*wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+"  1;
    "~*comment_author_[a-zA-Z0-9_]+"  1;
    "~*[a-zA-Z0-9]+_session)"  1;

    default      0;
}

По сути, здесь вы говорите, что значение bypass_cache будет 1, если регулярное выражение совпадает, иначе 0.

Так что, пока вы правильно поняли шаблон, он будет работать. И этот список есть только у вас, так как вы будете знать, какие файлы cookie обходить кеш на

...