§許可されたホストフィルター
Playは、アプリケーションにアクセスできるホストを設定できるフィルターを提供します。これは、キャッシュポイズニング攻撃を防ぐのに役立ちます。この攻撃の仕組みの詳細については、このブログ記事を参照してください。このフィルターは、許可されたホストのホワイトリストを導入し、ホワイトリストと一致しないホストを持つすべてのリクエストに400(不正なリクエスト)応答を送信します。
DNSリバインディング攻撃は、Playの開発者のインスタンスを攻撃するために使用できるため、開発時でもこのフィルターを使用することが重要です。短命のDNSリバインディングがlocalhostで実行されているサーバーを攻撃する方法の例については、Rails Webconsole DNSリバインディングを参照してください。
AllowedHostsFilterを持つPlayアプリケーションに対して機能テストを実行している場合、FakeRequest
とHelpers.fakeRequest()
は、既にHOST
がlocalhost
に設定されているリクエストを作成することに注意してください。
§許可されたホストフィルターの有効化
注記:Play 2.6.x以降、許可されたホストフィルターは、プロジェクトに自動的に適用されるPlayのデフォルトフィルターのリストに含まれています。フィルターページで詳細情報をご覧ください。
フィルターを手動で有効にするには、application.conf
でフィルターに許可されたホストフィルターを追加します。
play.filters.enabled += play.filters.hosts.AllowedHostsFilter
§許可されたホストの設定
application.conf
を使用して、フィルターが許可するホストを設定できます。デフォルトの設定については、Playフィルターのreference.conf
を参照してください。
play.filters.hosts.allowed
は、.example.com
またはexample.com
形式の文字列のリストです。先頭にドットが付いている場合、パターンはexample.comとそのすべてのサブドメイン(www.example.com
、foo.example.com
、foo.bar.example.com
など)と一致します。先頭にドットがない場合は、正確なドメインのみと一致します。アプリケーションが特定のポートで実行される場合は、ポート番号(例:.example.com:8080
)を含めることもできます。
すべてのホストと一致させるには.
パターンを使用できます(本番環境では推奨されません)。フィルターはホストの末尾のドット文字も削除するため、example.com
パターンはexample.com.
とも一致します。
設定例を以下に示します。
play.filters.hosts {
# Allow requests to example.com, its subdomains, and localhost:9000.
allowed = [".example.com", "localhost:9000"]
}
§ルート修飾子によるルートへの適用
許可されたホストのフィルタリングで一部のルートが正しく使用できない場合があります。これは、ロードバランサーのヘルスチェックの場合によくあります。ロードバランサーのヘルスチェックでは、サーバーのIPアドレスがホスト名として使用されることがよくあります。この重要な安全機能を完全に無効にするのではなく、ルート修飾子のホワイトリストを使用して、問題のあるルートをフィルターから除外しながら、デフォルトで有効にしておくことができます。
たとえば、デフォルトの設定では、フィルターから1つ以上のルートを除外するために使用できるanyhost
ルートタグが定義されています。
play.filters.hosts.routeModifiers.whiteList = [anyhost]
この設定では、anyhost
でタグ付けされたルートは、許可されたホストフィルターから除外されます。たとえば、ルートファイルは次のようになります。
+anyhost
GET /healthcheck controllers.HealthController.healthcheck
ホワイトリストが空でブラックリストが定義されている場合、許可されたホストフィルターは、ブラックリスト設定にあるタグでタグ付けされたルートのみに適用されます。たとえば、次の設定では、許可されたホストフィルターはexternal
でタグ付けされたルートのみに適用されます。
play.filters.hosts.routeModifiers.whiteList = []
play.filters.hosts.routeModifiers.blackList = [external]
この設定では、ルートファイルは次のようになります。
+external
GET / controllers.HomeController.index
GET /healthcheck controllers.HealthController.healthcheck
§テスト
AllowedHostsFilterフィルターは自動的に追加されるため、機能テストにはHost HTTPヘッダーを追加する必要があります。
FakeRequest
またはHelpers.fakeRequest
を使用している場合、Host
HTTPヘッダーは自動的に追加されます。play.mvc.Http.RequestBuilder
を使用している場合、ヘッダーを手動で追加する行を追加する必要がある場合があります。
Http.RequestBuilder request =
new Http.RequestBuilder()
.method(GET)
.header(Http.HeaderNames.HOST, "localhost")
.uri("/xx/Kiwi");
このドキュメントに誤りを見つけた場合、このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したい場合は、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。