
Estoy usando la siguiente expresión regular de declaración if en nginx
la configuración para hacer coincidir y bloquear algunas solicitudes incorrectas dentro del uri de solicitud. Estas consultas incorrectas solicitan siempre un solo argumento, pero cada vez con un nombre aleatorio (y un recuento alfanumérico). También siempre llegan a la página de inicio.
Ejemplo de mala consulta:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
¿Cómo puedo modificar esta expresión regular para excluir la coincidencia de algunos nombres de argumentos como key
o query
(es decir, /?query=somestring)?
Intenté usar corchetes y ?(!query)
no tuve suerte.
Por favor ayúdenme a corregir esta declaración de expresiones regulares. Gracias de antemano.
Respuesta1
Hay dos maneras de hacer esto. Usar unaaserción negativa anticipadao usar unmap
.
Por ejemplo:
if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }
La ventaja de map
es que las expresiones regulares se evalúan en orden hasta que se encuentra una coincidencia, por lo que se pueden evitar expresiones complejas de anticipación.
Por ejemplo:
map $request_uri $reject {
~*^/\?query= 0;
"~*^/\?\w{5,25}=\w{5,25}$" 1;
}
server {
...
if ($reject) { return 403; }
...
}
El map
bloque vive fuera del server
bloque. Si la regla solo se aplica a los URI que comienzan con /?
, debes agregarla a la expresión regular (como se muestra en mi segundo ejemplo).