
Estou usando a seguinte instrução if regex na nginx
configuração para corresponder e bloquear algumas solicitações incorretas dentro do uri da solicitação. Essas consultas incorretas sempre solicitam apenas um argumento, mas sempre com nome aleatório (e contagem de alfanum). Eles também sempre acessam a página inicial.
Exemplo de consulta incorreta:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
Como posso modificar esse regex para excluir a correspondência de alguns nomes de argumentos como key
ou query
(ou seja, /?query=somestring) ?
Tentei usar colchetes e ?(!query)
não tive sorte.
Por favor, ajude-me a corrigir esta instrução regex. Desde já, obrigado.
Responder1
Existem duas maneiras de fazer isso. Use umafirmação antecipada negativaou use ummap
.
Por exemplo:
if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }
A vantagem é map
que as expressões regulares são avaliadas em ordem até que uma correspondência seja encontrada, de modo que expressões lookahead complexas podem ser evitadas.
Por exemplo:
map $request_uri $reject {
~*^/\?query= 0;
"~*^/\?\w{5,25}=\w{5,25}$" 1;
}
server {
...
if ($reject) { return 403; }
...
}
O map
bloco vive fora do server
bloco. Se a regra se aplicar apenas a URIs que começam com /?
, você deverá adicionar isso à expressão regular (como mostrado no meu segundo exemplo).