0

私が使用している Web サーバーは Apache 2.2 です。外部から送信されたクエリ文字列に含まれるドメインを検証しようとしています。

有効なリクエストの例: https://something.example.com/aaa/bbb/ccc?returnurl=https://test.example.com/home

無効なリクエストの例:

  1. scheme://something.example.com/aaa/bbb/ccc?returnurl=https://something.evil.com/home
  2. scheme://something.example.com/aaa/bbb/ccc?returnurl=http://www.google.com
  3. scheme://something.example.com/aaa/bbb/ccct?returnurl=https://something.evil.com/blah?url=https://test.example.com/home

これまでのところ、httpd.conf ファイルには次のものがあります。

    RewriteEngine On

    RewriteCond %{REQUEST_URI} ^/aaa/bbb/ccc$
    RewriteCond %{QUERY_STRING} !(\.|https://|http://)example\.com(\.|/)|(\.|https://|http://)exampledev\.com(\.|/) [NC]
    RewriteRule ^(.*) / [R=403,L]

上記のコードは基本的にクエリ文字列を見て、example.com と exampledev.com が query_string にない場合、ユーザーを禁止されたページにリダイレクトします。

無効なリクエスト番号 3 は example.com を含むと見なされ、フィッシング攻撃と見なされる可能性があるため、このコードはジョブの一部のみを実行しています。

どういうわけか、query_string returnurl で返されるドメインを検証する必要があります。

http:// または httpd://、.com、.net、.org、またはその他のトップ レベル ドメインの間の文字列。

returnurl クエリ文字列として返されるドメインを検証する方法を教えてください。

4

1 に答える 1

0

以下を使用します。

RewriteEngine On

RewriteCond %{REQUEST_URI} ^/aaa/bbb/ccc$
RewriteCond %{QUERY_STRING} !(returnurl|[&]returnurl)=(http|https)://([a-zA-Z0-9]+[.]example[.]com|[a-zA-Z0-9]+[.]exampledev[.]com|example[.]com|exampledev[.]com)[&]{0,1}
RewriteRule ^(.*) / [R=403,L]
于 2012-06-26T15:49:08.823 に答える