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

Станислав server_inc на list.ru
Пт Май 26 00:17:22 UTC 2017


Привет,

Появилась такая задача - если от клиента в 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-ru