錯誤百科

可疑的 URL 來源變更

當 URL 解析導致非預期的來源變更時,在伺服器端渲染(SSR)環境中會發生此錯誤。這項檢查是 @angular/platform-server 中的安全性功能,旨在保護你的應用程式免於伺服器端請求偽造(SSRF)與安全性繞過。

說明

為了在 SSR 期間執行 HTTP 請求並處理路由狀態,Angular 必須把相對 URL 解析為絕對 URL。

在解析過程中,Angular 會驗證解析出的 URL 不會非預期地指向外部或不受信任的來源。如果某個 URL 看起來像相對路徑,卻解析到不同的來源,Angular 會拋出 NG05703 並封鎖該請求或導覽。

常見成因

  • 以反斜線開頭的劫持嘗試(開放重定向/SSRF 繞過):以斜線與反斜線開頭的相對路徑(例如 /\\attacker.com/path 或 \\\\attacker.com/path)在瀏覽器與伺服器端 URL 解析器中的解讀方式可能不同。在某些解析器實作中,這些路徑會解析為指向 attacker.com 的絕對 URL。Angular 會偵測這種不一致並封鎖解析。
  • 不允許變更到不同來源的狀態變更:當環境設定為只允許把 URL 變更限制在目前來源時,改變應用程式來源的導覽或 URL 更新(例如使用 location.replaceState 或 location.pushState)。
  • SSR 啟動 URL 不相符:在伺服器端渲染中,如果傳給渲染器的 url 與為應用程式設定的基底來源(例如 APP_BASE_HREF)不一致,路由器可能會在啟動時嘗試同步位置,造成不允許的來源變更。
  • 混淆的通訊協定 scheme:通訊協定經過混淆或格式錯誤的絕對 URL(例如 ht\ntp://evil.com/path),試圖繞過來源檢查。

除錯方式

檢查觸發此錯誤的 URL。確保它不含非預期的反斜線、換行或其他可能觸發解析異常的字元:

  • 避免在相對 URL 或路由路徑中使用反斜線(\)。
  • 確保任何使用者提供的 URL 或查詢參數在 SSR 中處理前,都經過適當的驗證與淨化。
  • 讓 SSR 啟動 URL 與設定的基底 URL 一致:如果此錯誤在 SSR 環境啟動時發生,請確保傳給渲染器的 url 與預期的基底來源/主機相符(例如 APP_BASE_HREF)。如果動態 URL 來自原始請求標頭(例如 X-Forwarded-Host)且與受信任的應用程式來源不符,請避免使用它們。
  • 如果你刻意要透過通訊協定相對 URL(//other-domain.com/path)向不同網域發出請求,請確保設定允許這麼做,或改用明確的 scheme(http:// 或 https://)。