文件

§允許主機過濾器

Play 提供一個過濾器,讓您可以設定哪些主機可以存取您的應用程式。這對於防止快取中毒攻擊很有用。有關此攻擊如何運作的詳細說明,請參閱 這篇部落格文章。此過濾器會導入允許主機的白名單,並對所有主機與白名單不符的請求傳送 400 (錯誤的請求) 回應。

即使在開發階段,這也是一個重要的過濾器,因為 DNS 重新繫結攻擊可以針對 Play 的開發人員執行個體使用:請參閱 Rails Webconsole DNS Rebinding,了解短暫 DNS 重新繫結如何攻擊執行於本機端伺服器的範例。

請注意,如果您針對具有 AllowedHostsFilter 的 Play 應用程式執行功能測試,則 FakeRequestHelpers.fakeRequest() 會建立一個請求,其中 HOST 已設定為 localhost

§啟用允許主機過濾器

注意:從 Play 2.6.x 開始,允許主機過濾器已包含在 Play 的預設過濾器清單中,這些過濾器會自動套用至專案。有關更多資訊,請參閱 過濾器頁面

若要手動啟用篩選器,請將允許的 hosts 篩選器新增至 application.conf 中的篩選器

play.filters.enabled += play.filters.hosts.AllowedHostsFilter

§設定允許的 hosts

您可以使用 application.conf 設定篩選器允許的 hosts。請參閱 Play 篩選器 reference.conf 以查看預設值。

play.filters.hosts.allowed 是字串清單,格式為 .example.comexample.com。如果字串前面有句點,則模式會比對 example.com 及所有子網域 (www.example.comfoo.example.comfoo.bar.example.com 等)。如果字串前面沒有句點,則只會比對完全相符的網域。如果您的應用程式在特定埠上執行,您也可以包含埠號,例如 .example.com:8080

您可以使用 . 模式比對所有 hosts (不建議在生產環境中使用)。請注意,篩選器也會移除 hosts 尾端的句點字元,因此 example.com 模式會比對 example.com.

以下是範例設定。

play.filters.hosts {
  # Allow requests to example.com, its subdomains, and localhost:9000.
  allowed = [".example.com", "localhost:9000"]
}

§透過路由修改器套用至路由

您可能會發現,某些路由無法與允許的 hosts 篩選搭配使用。這通常發生在負載平衡器健康檢查時,因為負載平衡器健康檢查通常會使用伺服器的 IP 位址作為主機名稱。與其完全停用此項重要的安全功能,您可以使用路由修改器白名單將有問題的路由排除在篩選器之外,同時維持預設啟用狀態。

例如,預設設定會定義 anyhost 路由標籤,可將一個或多個路由排除在篩選器之外。

play.filters.hosts.routeModifiers.whiteList = [anyhost]

使用此設定後,標籤為 anyhost 的路由將會豁免允許的 hosts 篩選器,例如,您的路由檔案可能會如下所示

+anyhost
GET           /healthcheck          controllers.HealthController.healthcheck

如果白名單為空且黑名單有定義,則允許的 hosts 篩選器只會套用至標籤為黑名單設定中現有標籤的路由。例如,以下設定只會將允許的 hosts 篩選器套用至標籤為 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 標頭。

如果您正在使用 FakeRequestHelpers.fakeRequest,那麼 Host HTTP 標頭會自動為您加入。如果您正在使用 play.mvc.Http.RequestBuilder,那麼您可能需要加入自己的程式碼行手動加入標頭

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

下一步:設定 HTTPS 重新導向


在這個文件中發現錯誤?這個頁面的原始碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。