
リクエスト 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 番目の例に示すように)。