ModSecurity SecRule は、内部書き換え (index.php、app.php など) ではなく、元のブラウザ URL に基づいています。

ModSecurity SecRule は、内部書き換え (index.php、app.php など) ではなく、元のブラウザ URL に基づいています。

私は Symfony 2 サイトで作業しており、特定のブラウザ URL に一致する ModSecurity ルールを作成しようとしています。IE example.com/results

Symfony 2 は、.htaccess 内のルールを使用してすべてのリクエストを app.php に内部的に書き換えるため、ModSecurity ルールで REQUEST_URI を確認すると、app.php に設定されています。関連すると思われる他のサーバー パラメータも試しましたが、すべて app.php または空白です。

内部書き換えの結果ではなく、ブラウザによって要求された URL に基づいて、構成ファイルに ModSecurity ルールを作成する方法はありますか?

同じ問題が wordpress などの CMS でも発生しているようです。すべてが index.php に書き換えられるため、特定のルートに modsec ルールを適用する方法が見つかりません。(WP は非常に一般的なので、同じ問題を検索すれば答えが見つかるかもしれないと考えました。)

答え1

THE_REQUESTこの回答によると、サーバー変数を使用できるようです:https://stackoverflow.com/a/27968463/160565

:

私は mod_rewrite を使用して、THE_REQUESTmod_security ルールのすぐ上の環境変数にダンプし、それに基づいてマッチングしています。

前述のとおり、 はTHE_REQUESTmod_security 変数ではなく、mod_rewrite によって使用される Apache サーバー変数です。mod_security で直接同等の変数はREQUEST_LINE、つまりリクエストの最初の行です。これは次のような文字列の形式になります。

GET /foo/bar HTTP/1.1

THE_REQUEST(mod_rewrite) 変数は URL が書き換えられても変更されませんが、REQUEST_URI(mod_rewrite) は変更されます。

しかし、(mod_security)変数が書き換えられたURLを返していることに少し驚きましたREQUEST_URI(これはディレクティブの順序やmod_securityの使用に関係しているのかもしれません)。埋め込み?) は、mod_security ルールで実際に (mod_rewrite) 変数 (これを env var に割り当てる?) を使用していない限り、最初に要求された URL ではなく、REQUEST_URI(mod_rewrite) 変数 (これを env var に割り当てる?) になりますか?

mod_security ルールのすぐ上...

mod_security ルールは、まだない場合は、mod_rewrite ディレクティブよりも前に、ファイルの先頭に配置する必要があります。(順序が本当に重要かどうかはわかりませんが。)

REQUEST_URI(mod_security) 変数は、名前が同じですが、(mod_rewrite) 変数と同じではないことに注意してくださいREQUEST_URI。特に、REQUEST_URI(mod_security) にはクエリ文字列が含まれますが、REQUEST_URI(mod_rewrite) には含まれません。

参照:


アップデート:

... REQUEST_URI(mod_security) 変数は書き換えられた URL を返します

mod_securityルールをリクエスト内で遅すぎるタイミングで実行している可能性があります。つまり、間違ったタイミングで実行してphaseいる可能性があります。リクエスト比較対象となるURLREQUEST_URI段階1 または 2 (リクエスト)。後のフェーズ (つまり 3 - 5) はレスポンスに対して処理され、リクエストされた URL ではなく書き換えられた URL が表示される理由が説明される可能性があります。

phaseアクション引数またはSetDefaultActionディレクティブ。例:

SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"

5 つのフェーズは次のとおりです。

  1. リクエスト ヘッダー (REQUEST_HEADERS)
  2. リクエスト本文 (REQUEST_BODY)
  3. レスポンス ヘッダー (RESPONSE_HEADERS)
  4. レスポンス本文 (RESPONSE_BODY)
  5. ログ記録 (LOGGING)

ModSecurity バージョン v2.7 以降では、いくつかのフェーズ番号にエイリアスがあります。

2 - リクエスト
4 - レスポンス
5 - ログ

例:

SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"

参照:

答え2

この回答によると、サーバー変数 THE_REQUEST を使用できるようです:https://stackoverflow.com/a/27968463/160565

関連情報