URL を正規表現と照合して、「シャットダウン」コマンドを反映しているかどうかをテストしています。
シャットダウンを実行する URL は次のとおりです。
/exec?debug=true&command=shutdown&f=0
これは、シャットダウンを実行する別の、正当ではあるが紛らわしい URL です。
/exec?commando=yes&zcommand=34&command=shutdown&p
ここで、 command=...パラメータが1 つしかなく、それがcommand=shutdownであることを確認する必要があります。または、最初の command=...パラメータがcommand=shutdownであることを確認して生きることもできます。
要求された正規表現のテストは次のとおりです。
/exec?version=0.4&command=shutdown&out=JSON&zcommand=1
一致する必要があります
/exec?version=0.4&command=startup&out=JSON&zcommand=1&commando=shutdown
一致しないはずです
/exec?command=shutdown&out=JSON
一致する必要があります
/exec?version=0.4&command=admin&out=JSON&zcommand=1&command=shutdown
一致しないはずです
これが私のベースラインです-上記のテストに合格する正規表現-最後のものを除くすべて:
^/exec?(.*\&)*command=shutdown(\&.*)*$
問題は、複数の command=... が発生することです。最初のコマンドはシャットダウンされません。
私は後読みを使用してみました:
^/exec?(.*\&)*(?<!(\&|\?)command=.*)command=shutdown(\&.*)*$
しかし、私は得ています:
Look-behind group does not have an obvious maximum length near index 31
アトミックグループ化も試しました。無駄に。次の式を NOT マッチにすることはできません:
/exec?version=0.4&command=admin&out=JSON&zcommand=1&command=shutdown
すべてのテストに合格する正規表現を手伝ってくれる人はいますか?
明確化
私はあなたにいくつかの文脈を借りていることがわかりました。
私の仕事は、システムのすべてのサーブレットの入り口を保護し、開いている HTTP セッションがある (つまり、ログインが成功したことを確認する) フィルターを構成することです。フィルタを使用すると、ログインを必要としない URL を構成することもできます。
いくつかの例外は簡単です: /login はログインを必要としません。localhost への呼び出しにはログインは必要ありません。
しかし、複雑になることもあります。他のコマンドはログインを要求できますが、ログインを要求できない shutdown コマンドのように (その奇妙な理由は私の質問の範囲外です)。
これはセキュリティ上の問題であるため、ユーザーが単に &command=shutdown を URL に追加してフィルターをバイパスすることを許可することはできません。
したがって、正規表現が本当に必要です。そうしないと、構成仕様を再定義する必要があります。