Sdílet prostřednictvím


Analýza řízení adresáře LDAP je nyní přísnější

Rozhraní .NET dříve používalo System.DirectoryServices.Protocols.BerConverter k analýze System.DirectoryServices.Protocols.DirectoryControl objektů přijatých přes síť a k vygenerování polí System.DirectoryServices.Protocols.DirectoryControl bajtů, které odeslal. System.DirectoryServices.Protocols.BerConverter použili funkci analýzy BER specifickou pro operační systém. Tato funkce analýzy se teď implementuje ve spravovaném kódu.

Předchozí chování

V důsledku použití System.DirectoryServices.Protocols.BerConverterbylo parsování System.DirectoryServices.Protocols.DirectoryControl objektů dříve poměrně volné:

  • Značky ASN.1 u každé hodnoty nebyly zkontrolovány.
  • Koncová data po konci parsovaného DirectoryControl byly ignorovány, stejně jako koncová data v ASN.1 SEQUENCE.
  • Na Linuxu délky řetězce typu OCTET, které přesahovaly konec nadřazené sekvence, vracely data mimo nadřazenou sekvenci.
  • V dřívějších verzích Windows vrátil řetězec OCTET nulové délky null místo prázdného řetězce.
  • Při čtení obsahu System.DirectoryServices.Protocols.DirectoryControl jako řetězce kódovaného jako UTF8 se nevyvolala výjimka pro neplatnou sekvenci UTF8.
  • Při předání neplatného řetězce UTF-8 konstruktoru VlvRequestControlnebyla vyvolána žádná výjimka.

I když to není změna, která by způsobovala chybu, Windows vždy kódovaly značky ASN.1 se čtyřbajtovou délkou, zatímco Linux použil tolik bajtů pro délku značky, kolik bylo potřeba. Obě reprezentace byly platné, ale tento rozdíl v chování mezi platformami je nyní pryč; Chování Linuxu se teď také zobrazuje ve Windows.

Nové chování

Od verze .NET 10 je analýza DirectoryControl mnohem přísnější a teď je konzistentní napříč platformami a verzemi:

  • Značky ASN.1 jsou nyní kontrolovány.
  • Přebytečná data už nejsou povolena.
  • Délka OCTET STRINGa SEQUENCEje teď zkontrolovaná.
  • Nulová délka OCTET STRINGnyní vždy vrací prázdný řetězec.
  • Pokud server odešle neplatnou sekvenci bajtů UTF8, logika analýzy System.DirectoryServices.Protocols.DirectoryControl nyní vyvolá výjimku, a nikoli tiše nahradit neplatné znaky známou hodnotou.

Při volání konstruktoru VlvRequestControl také důkladněji ověřujeme chyby. Předání řetězce, který nelze zakódovat jako hodnotu UTF8, nyní vyvolá EncoderFallbackException.

Zavedená verze

.NET 10 Preview 1

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Tato změna byla provedena pro dodržování předpisů RFC a specifikace. V různých dokumentech RFC a sekcích MS-ADTS je controlValue definován jako BER kódování struktury ASN.1 s formulací podobnou této (z RFC2891, sekce 1.2):

ControlType je nastaven na hodnotu 1.2.840.113556.1.4.474. Závažnost je NEPRAVDA (MŮŽE chybět). ControlValue je OCTET STRING, jehož hodnotou je kódování BER hodnoty následující SEKVENCE.

Tím se zabrání přívěskovým datům. Kromě toho vylučuje kódování BER struktur ASN.1 s odlišnými značkami ASN.1 a neplatná kódování BER (například OCTET STRINGy, které jsou delší než jejich obsažené SEQUENCE.)

U konstruktoru VlvRequestControl vyvolání výjimky v rané fázi znamená, že uživatelé můžou důvěřovat tomu, že se na server odesílají pouze hodnoty, které explicitně zadávají. Neexistují žádné okolnosti, kdy mohou omylem odeslat EF BF BD na server, protože předali řetězec, který nelze zakódovat na platné bajty UTF8.

Servery by měly odpovídat RFC a specifikacím. Při volání konstruktoru EncoderFallbackException nezapomeňte zpracovat VlvRequestControl.

Ovlivněná rozhraní API