Nginx gleicht jedes Wort in der if-Anweisung ab, außer einem

Nginx gleicht jedes Wort in der if-Anweisung ab, außer einem

Ich verwende den folgenden regulären Ausdruck für die if-Anweisung in nginxder 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 keyoder 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 mapbesteht 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 mapBlock befindet sich außerhalb des serverBlocks. 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).

verwandte Informationen