mirror of https://github.com/yandex/gixy
				
				
				
			
		
			
				
	
	
		
			31 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			2.5 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) |