Re: Ограничение доступа по аргументу в query string

Maxim Dounin mdounin на mdounin.ru
Пт Май 26 13:13:14 UTC 2017


Hello!

On Thu, May 25, 2017 at 05:17:22PM -0700, Станислав wrote:

> Привет,
> 
> Появилась такая задача - если от клиента в query string присутствует 
> аргумент "controller", nginx должен что-то делать (например разрывать 
> соединение). Было сделано такое:
> 
> if ($arg_controller) {
>        return 444 ;
> }
> 
> Работало, нашли как это можно обойти: curl -s -L -D - 
> http://localhost/testme.php?controller=&controller=heresmysecretkeyword
> 
> Nginx не будет делать "return 444" так как аргумент controller пустой 
> (не определен), второй аргумент с таким же именем nginx игнорирует. 
> Данные передаются бэкэнду таким способом:
> 
> location = /testme.php {
> .....
>      fastcgi_param QUERY_STRING controller=$secret_var&$args;
> .....
> }
> 
> Где $args приобретает форму: controller=&controller=heresmysecretkeyword
> 
> Бэкэнд перезаписывает аргумент последним аргументом в query string, и в 
> код интерпретируемым бэкэндом передается heresmysecretkeyword .
> 
> Сталкивался кто-то с такой ситуацией? Как можно это пофиксить если нет 
> возможности трогать сам бэкэнд. Пока только в голову приходит проверять 
> регулярным выражением $args на присутствие нежелаемого аргумента. Не 
> очень хочу юзать тут regex :/

Лучше всего - на пытаться завязывать безопасность на аргументы 
запроса, тем более - на их разбор nginx'ом через переменные 
$arg_*.  Разбор аргументов запроса не стандартизирован, и это 
может много где выйти боком: как в вашем случае по разному может 
обрабатываться случай нескольких аргументов, или же бекенд может 
понимать более одного разделителя (скажем, php обычно поддерживает 
не только "&", но и ";"), и так далее.

Если очень надо - выясняйте подробности обработки аргументов 
бекендом и фильтруйте по $args.  Но, как уже сказано выше, лучше 
всего вообще не пытаться этого делать.

-- 
Maxim Dounin
http://nginx.org/


Подробная информация о списке рассылки nginx-ru