ドキュメント

§許可されたホストフィルター

Playは、アプリケーションにアクセスできるホストを設定できるフィルターを提供します。これは、キャッシュポイズニング攻撃を防ぐのに役立ちます。この攻撃の仕組みの詳細については、このブログ記事を参照してください。このフィルターは、許可されたホストのホワイトリストを導入し、ホワイトリストと一致しないホストを持つすべてのリクエストに400(不正なリクエスト)応答を送信します。

DNSリバインディング攻撃は、Playの開発者のインスタンスを攻撃するために使用できるため、開発時でもこのフィルターを使用することが重要です。短命のDNSリバインディングがlocalhostで実行されているサーバーを攻撃する方法の例については、Rails Webconsole DNSリバインディングを参照してください。

AllowedHostsFilterを持つPlayアプリケーションに対して機能テストを実行している場合、FakeRequestHelpers.fakeRequest()は、既にHOSTlocalhostに設定されているリクエストを作成することに注意してください。

§許可されたホストフィルターの有効化

注記: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.comfoo.example.comfoo.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を使用している場合、HostHTTPヘッダーは自動的に追加されます。play.mvc.Http.RequestBuilderを使用している場合、ヘッダーを手動で追加する行を追加する必要がある場合があります。

Http.RequestBuilder request =
    new Http.RequestBuilder()
        .method(GET)
        .header(Http.HeaderNames.HOST, "localhost")
        .uri("/xx/Kiwi");

次へ:HTTPSリダイレクトの設定


このドキュメントに誤りを見つけた場合、このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したい場合は、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。