Nginxはif文内の1つを除くすべての単語に一致します

Nginxはif文内の1つを除くすべての単語に一致します

リクエスト URI 内の不正なリクエストを一致させてブロックするために、構成で次の if ステートメント正規表現を使用していますnginx。これらの不正なクエリは常に 1 つの引数のみを要求しますが、毎回ランダムな名前 (および英数字の数) を使用します。また、常にホームページにアクセスします。

悪いクエリの例: /?some1bad0query2=nminkvywbjfdysnvhp

if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
  return 403;
}

keyこの正規表現を変更して、 orのような一部の引数名query(つまり /?query=somestring) との一致を除外するにはどうすればよいですか?

丸括弧を使用しようとしましたが、?(!query)うまくいきませんでした。

この正規表現ステートメントを修正するのを手伝ってください。よろしくお願いします。

答え1

これを行うには2つの方法があります。否定先読みアサーションまたはmap

例えば:

if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }

の利点はmap、一致が見つかるまで正規表現が順番に評価されるため、複雑な先読み式を回避できることです。

例えば:

map $request_uri $reject {
    ~*^/\?query=                0;
    "~*^/\?\w{5,25}=\w{5,25}$"  1;
}
server {
    ...
    if ($reject) { return 403; }
    ...
}

ブロックはブロックmapの外側にありますserver。ルールが で始まる URI にのみ適用される場合は/?、それを正規表現に追加する必要があります (2 番目の例に示すように)。

関連情報