安全性:Cookie 名称编码已删除

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 框架中发现了问题。 编码和解码可以使攻击者使用诸如 __%48ost- 的编码值来假冒 __Host- 之类的保留前缀,从而绕过称为 Cookie 前缀的安全功能。 此攻击需要利用辅助攻击(例如跨站点脚本 (XSS) 漏洞)在网站中注入欺诈性 Cookie。 默认情况下,ASP.NET Core 或者 Microsoft.Owin 库或模板中不使用这些前缀。

如果要将项目迁移到 ASP.NET Core 5.0 或更高版本,请确保其 Cookie 名称符合令牌规范要求:ASCII 字符不包括控件和分隔符 "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT。 如果在 Cookie 名称或其他 HTTP 标头中使用非 ASCII 字符,则可能导致服务器异常或客户端不正确地往返。

受影响的 API