
Ich verwende den folgenden regulären Ausdruck für die if-Anweisung in nginx
der Konfiguration, um einige fehlerhafte Anfragen innerhalb der Anfrage-URI abzugleichen und zu blockieren. Diese fehlerhaften Anfragen fordern immer nur ein Argument an, aber jedes Mal mit einem zufälligen Namen (und einer zufälligen Anzahl von Buchstaben). Sie führen auch immer zur Homepage.
Beispiel einer fehlerhaften Abfrage:
/?some1bad0query2=nminkvywbjfdysnvhp
if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
return 403;
}
Wie kann ich diesen regulären Ausdruck ändern, um die Übereinstimmung mit bestimmten Argumentnamen wie key
oder query
(z. B. /?query=somestring) auszuschließen?
Ich habe versucht, runde Klammern zu verwenden, ?(!query)
aber ohne Erfolg.
Bitte helfen Sie mir, diese Regex-Anweisung zu korrigieren. Vielen Dank im Voraus.
Antwort1
Hierzu gibt es zwei Möglichkeiten. Verwenden Sie einnegative Vorausschauoder verwenden Sie einemap
.
Zum Beispiel:
if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }
Der Vorteil map
besteht darin, dass reguläre Ausdrücke der Reihe nach ausgewertet werden, bis eine Übereinstimmung gefunden wird. Somit können komplexe Lookahead-Ausdrücke vermieden werden.
Zum Beispiel:
map $request_uri $reject {
~*^/\?query= 0;
"~*^/\?\w{5,25}=\w{5,25}$" 1;
}
server {
...
if ($reject) { return 403; }
...
}
Der map
Block befindet sich außerhalb des server
Blocks. Wenn die Regel nur für URIs gilt, die mit beginnen /?
, sollten Sie dies dem regulären Ausdruck hinzufügen (wie in meinem zweiten Beispiel gezeigt).