指摘されたように、問題は正規表現ではなく、経由で送信しているデータにDefaultEncoder.getValidInput(args...)
何らかの形式の混合エンコーディングが含まれていることです。
あなたは文脈についてこれ以上議論することはありませんが、一般的に言って、あなたが受け入れたあなたの答えは非常に致命的な欠陥であり、誰にも勧められるべきではありません.
入力が失敗しているのは、ESAPI が入力を検証のために正規表現に渡す前に正規化するためです。正規化が実際に提供するものは 2 つありますが、最も重要なことは、ESAPI の実装が複数のエンコード攻撃を検出することです。
マルチエンコーディングとは?データの一部を複数回エンコードすることにより、入力の検証を無効にしようとしています。パーセント エンコーディングでは、次のようになります。
ORIGINAL INPUT:
<script>alert('xss');</script>
ENCODED ONCE:
%3Cscript%3Ealert(%27xss%27)%3B%3C%2Fscript%3E
ENCODED TWICE:
%253Cscript%253Ealert(%2527xss%2527)%253B%253C%252Fscript%253E
パーセントコーデックをオフにすることをお勧めするあなたの答えは、攻撃が入力検証ルーチンを無効にしようとしているかどうかを検出できなくなるという、アプリケーションに重大なセキュリティ脆弱性をもたらしました。パーセント エンコーディングは、非常に標準的な攻撃手法です。複数のエンコーディング手法を含むアプリケーションにコードを強制しようとする方法は複数あります。
ここで本当に必要なのは、アプリケーションが処理している入力が、ここで遊んでいる種類の入力を使用する必要がある理由についてのより良い議論です。全体像のサンプルデータを使用した実際のユースケースは何ですか? 目の前にあるものに対して、私にできる唯一のことは、パーセント コーデックを削除すると脆弱になることを明確に述べるだけです。
正規化せずに一時的に検証したい場合はESAPIが持っています
Validator.getValidInput(String context, String input, String type, int maxLength, boolean allowNull, boolean canonicalize);
これにより、正規化を一時的にオフにすることができます。
ただし、正規化は、処理している入力が正規表現に対して安全に使用できることを保証するためにあります。