origins.md 2.6 KB

[origins] Проблемы валидации referrer/origin

Нередко валидация заголовка запроса Referer или Origin делается при помощи регулярного выражения. Зачастую, это необходимо для условного выставления заголовка X-Frame-Options (защита от ClickJacking) или реализации Cross-Origin Resource Sharing.

Наиболее распространенно два класса ошибок конфигурации, которые приводят к этой проблеме:

  • ошибки в составлении регулярного выражения;
  • разрешение не доверенных third-party доменов.

По умолчанию Gixy не валидирует регулярные выражение на предмет матчинга third-party доменов, т.к. не знает кому можно верить. Передать список доверенных доменом можно при помощи опции --origins-domains example.com,foo.bar

Как самостоятельно обнаружить?

Все довольно "просто":

  • необходимо найти все директивы if, которые делают проверку переменной $http_origin или $http_referer;
  • убедится что в регулярном выражении нет проблем.

Пример плохой конфигурации:

if ($http_origin ~* ((^https://www\.yandex\.ru)|(^https://ya\.ru)/)) {
	add_header 'Access-Control-Allow-Origin' "$http_origin";
	add_header 'Access-Control-Allow-Credentials' 'true';
}

TODO(buglloc): описать типичные проблемы при составлении регулярных выражений TODO(buglloc): Regex Ninja?

Что делать?

  • исправить регулярное выражение или отказаться от него вовсе :)
  • если вы проверяете заголовок запроса Referer то, возможно (имеются противопоказания), лучшим решением было бы воспользоваться модулем ngx_http_referer_module;
  • если вы проверяете заголовов запроса Origin то, зачастую, лучше использовать map и отказаться от регулярных выражений.