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и отказаться от регулярных выражений.