mirror of https://github.com/yandex/gixy
33 lines
2.6 KiB
Markdown
33 lines
2.6 KiB
Markdown
# [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`;
|
||
- убедится что в регулярном выражении нет проблем.
|
||
|
||
Пример плохой конфигурации:
|
||
```nginx
|
||
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](http://nginx.org/ru/docs/http/ngx_http_referer_module.html);
|
||
- если вы проверяете заголовов запроса `Origin` то, зачастую, лучше использовать `map` и отказаться от регулярных выражений.
|