Рейтинг:1

Nginx соответствует любому слову в операторе if, кроме одного

флаг cn

Я использую следующее регулярное выражение оператора if в нгинкс config для сопоставления и блокировки некоторых неверных запросов внутри запроса uri. Эти плохие запросы всегда запрашивают только один аргумент, но каждый раз со случайным именем (и количеством букв). Они также всегда попадают на главную страницу.

Пример неправильного запроса: /?some1bad0query2=nminkvywbjfdysnvhp

если ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
  вернуть 403;
}

Как я могу изменить это регулярное выражение, чтобы исключить совпадение некоторых имен аргументов, таких как ключ или же запрос (т.е. /?query=somestring) ?

Я пытался использовать круглые скобки и ?(!запрос) но не повезло.

Пожалуйста, помогите мне исправить это выражение регулярного выражения. Заранее спасибо.

Richard Smith avatar
флаг jp
Является ли это просто плохим примером, потому что `query=somestring` в любом случае не соответствует вашему регулярному выражению, так как длина `query` меньше 6 символов?
флаг cn
да определенно это было неправильно. исправлено регулярное выражение, чтобы оно начиналось с имени аргумента 5 длины (запрос). но мне все еще нужен пример того, как я могу смягчить эту атаку и обойти белый список хороших аргументов (таких как запрос, поиск и т. д.)
Рейтинг:0
флаг jp

Есть два способа сделать это. Использовать отрицательное предварительное утверждение или используйте карта.

Например:

если ($request_uri ~ "(?!запрос)\w{5,25}=\w{5,25}$") { return 403; }

Преимущество карта заключается в том, что регулярные выражения оцениваются по порядку до тех пор, пока не будет найдено совпадение, поэтому можно избежать сложных опережающих выражений.

Например:

карта $request_uri $отклонить {
    ~*^/\?запрос= 0;
    "~*^/\?\w{5,25}=\w{5,25}$" 1;
}
сервер {
    ...
    если ($ отклонить) { вернуть 403; }
    ...
}

карта блок живет за пределами сервер блокировать. Если правило применяется только к URI, которые начинаются с /?, вы должны добавить это к регулярному выражению (как показано во втором примере).

флаг cn
Спасибо, Ричард! Карта кажется мне более элегантным решением. Проверено, работает без нареканий. Кстати. моя ошибка в операторе if заключалась в том, что я поставил ?! блокировать после аргумента

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.