Zabezpieczenia: usunięto kodowanie nazw plików cookie

Standard pliku cookie HTTP zezwala tylko na określone znaki w nazwach i wartościach plików cookie. Aby obsługiwać niedozwolone znaki, ASP.NET Core:

  • Koduje podczas tworzenia pliku cookie odpowiedzi.
  • Dekoduje podczas odczytywania pliku cookie żądania.

W ASP.NET Core 5.0 to zachowanie kodowania zmieniło się w odpowiedzi na problem z zabezpieczeniami.

Aby zapoznać się z dyskusją, zobacz problem z usługą GitHub dotnet/aspnetcore#23578.

Wprowadzona wersja

5.0 (wersja zapoznawcza 8)

Stare zachowanie

Nazwy plików cookie odpowiedzi są kodowane. Nazwy plików cookie żądań są dekodowane.

Nowe zachowanie

Kodowanie i dekodowanie nazw plików cookie zostało usunięte. W przypadku wcześniejszych obsługiwanych wersji ASP.NET Core zespół planuje rozwiązać problem z dekodowaniem w miejscu. Ponadto wywołanie IResponseCookies.Append z nieprawidłową nazwą pliku cookie zgłasza wyjątek typu ArgumentException. Kodowanie i dekodowanie wartości plików cookie pozostaje niezmienione.

Przyczyna wprowadzenia zmiany

Wykryto problem w wielu strukturach internetowych. Kodowanie i dekodowanie może umożliwić osobie atakującej obejście funkcji zabezpieczeń o nazwie prefiksy plików cookie przez fałszowanie prefiksów zarezerwowanych, takich jak z zakodowanymi wartościami, takimi jak __Host-__%48ost-. Atak wymaga dodatkowego wykorzystania w celu wstrzyknięcia sfałszowanych plików cookie, takich jak luka w zabezpieczeniach skryptów między witrynami (XSS) w witrynie internetowej. Te prefiksy nie są domyślnie używane w ASP.NET Core lub Microsoft.Owin biblioteki ani szablony.

Jeśli przenosisz projekty do platformy ASP.NET Core 5.0 lub nowszej, upewnij się, że ich nazwy plików cookie są zgodne z wymaganiami specyfikacji tokenu: znaki ASCII z wyłączeniem kontrolek i separatorów "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT. Użycie znaków innych niż ASCII w nazwach plików cookie lub innych nagłówków HTTP może spowodować wyjątek od serwera lub być nieprawidłowo zaokrąglone przez klienta.

Dotyczy interfejsów API