2.5 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