HTTP Cookie 标准仅允许 Cookie 名称和值中的特定字符。 为了支持不允许的字符,ASP.NET Core:
- 创建响应 Cookie 时进行编码。
- 在读取请求 Cookie 时进行解码。
在 ASP.NET Core 5.0 中,此编码行为已更改,以响应安全问题。
有关讨论,请参阅 GitHub 问题 dotnet/aspnetcore#23578。
已引入的版本
5.0 预览版 8
旧行为
响应 Cookie 名称已编码。 对请求 Cookie 名称进行解码。
新行为
删除了 Cookie 名称的编码和解码。 对于以前 支持的 ASP.NET Core 版本,团队计划就地缓解解码问题。 此外,使用无效 Cookie 名称调用 IResponseCookies.Append 将引发类型 ArgumentException异常。 Cookie 值的编码和解码保持不变。
更改原因
在 多个 Web 框架中发现了一个问题。 编码和解码可能允许攻击者通过使用类似的编码值来欺骗类似__Host-
的保留前缀,进而绕过称为__%48ost-
的安全特性。 该攻击需利用其他漏洞,例如跨站脚本(XSS)漏洞,来将伪造的 Cookie 注入网站。 默认情况下,这些前缀不会在 ASP.NET Core 或库或 Microsoft.Owin
模板中使用。
建议的措施
如果要将项目移动到 ASP.NET Core 5.0 或更高版本,请确保其 Cookie 名称符合 令牌规范要求:不包括控件和分隔符的 "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
ASCII 字符。 如果在 Cookie 名称或其他 HTTP 标头中使用非 ASCII 字符,则可能导致服务器异常或客户端不正确地往返。
受影响的 API
- HttpRequest.Cookies
- HttpResponse.Cookies
Microsoft.Owin.IOwinRequest.Cookies
Microsoft.Owin.IOwinResponse.Cookies