Как Nginx и php не поняли друг друга

Три тестовых стенда были закрыты VPN. Исключение сделали только для платежных вебхуков: платежная система должна сообщать приложению об успешной оплате через интернет. Nginx проверял параметр route и пропускал запрос, если тот вел на вебхук. Но один параметр можно передать дважды:

?route=extension/payment/acard7/webhook&route=common/home

Nginx брал первое значение и разрешал запрос (из $arg_route). А PHP - последнее и открывал обычную страницу магазина. Проблема возникла потому, что Nginx и PHP по-разному интерпретировали один запрос.

Проверку изменили: вместо отдельного route настроили Nginx на анализ всей строки запроса (map $args ...): разрешенный route должен стоять первым, встречаться ровно один раз и вести только на вебхук. Повторные, закодированные и некорректные параметры получают 403.

Главный вывод: проверка доступа ненадежна, если разные уровни системы по-разному могут понимать один и тот же запрос.

Как Nginx и php не поняли друг друга | Сетка — социальная сеть от hh.ru