安全性:Cookie 名稱編碼已移除

HTTP Cookie 標準 (英文) 只允許在 Cookie 名稱和值中使用特定字元。 為了支援不允許的字元,ASP.NET Core:

  • 會在建立回應 Cookie 時進行編碼。
  • 會在讀取要求 Cookie 時進行解碼。

在 ASP.NET Core 5.0 中,此編碼行為已變更以回應某個安全性顧慮。

如需相關討論,請參閱 GitHub 問題 dotnet/aspnetcore#23578 (英文)。

導入的版本

5.0 Preview 8

舊的行為

回應 Cookie 名稱會進行編碼。 要求 Cookie 名稱會進行解碼。

新的行為

已移除對 Cookie 名稱的編碼和解碼。 針對先前的 ASP.NET Core 支援版本,小組計畫就地緩解解碼問題。 此外,以無效的 Cookie 名稱呼叫 IResponseCookies.Append 會擲回 ArgumentException 類型的例外狀況。 Cookie 值的編碼和解碼會保持不變。

變更原因

多個 Web 架構 (英文) 中發現問題。 編碼和解碼可能會讓攻擊者略過稱為 Cookie 前置詞 (英文) 的安全性功能,方法是使用 __%48ost- 之類的編碼值來詐騙如 __Host- 的保留前置詞。 該攻擊需要使用次要惡意探索來在網站中插入詐騙的 Cookie,例如跨網站指令碼 (XSS) 弱點。 ASP.NET Core 或 Microsoft.Owin 程式庫或範本預設不會使用這些前置詞。

如果您要將專案移至 ASP.NET Core 5.0 或更新版本,請確定其 Cookie 名稱符合權杖規格需求 (英文):ASCII 字元,排除控制項和分隔符號 "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT。 在 Cookie 名稱或其他 HTTP 標頭中使用非 ASCII 字元可能會導致伺服器發生例外狀況,或導致用戶端不正確地來回。

受影響的 API