mirror of https://github.com/yandex/gixy
2.6 KiB
2.6 KiB
[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
и отказаться от регулярных выражений.