次の方法で共有


LDAP DirectoryControl の解析がより厳格になりました

以前は、.NET System.DirectoryServices.Protocols.BerConverter を使用して、ネットワーク経由で受信した System.DirectoryServices.Protocols.DirectoryControl オブジェクトを解析し、送信した System.DirectoryServices.Protocols.DirectoryControl バイト配列を生成しました。 System.DirectoryServices.Protocols.BerConverter OS 固有の BER 解析機能を使用しました。 この解析機能は、マネージド コードで実装されるようになりました。

以前の動作

System.DirectoryServices.Protocols.BerConverterを使用した結果、System.DirectoryServices.Protocols.DirectoryControl オブジェクトの解析はかなり緩いものでした。

  • 各値の ASN.1 タグはチェックされませんでした。
  • ASN.1 SEQUENCE 内の末尾のデータと同様に、解析された DirectoryControl の終了後の末尾のデータは無視されました。
  • Linux では、親シーケンスの末尾を超えて拡張された OCTET STRING の長さは、親シーケンスの外側のデータを返しました。
  • 以前のバージョンの Windows では、長さ 0 の OCTET STRING が空の文字列ではなく null 返されました。
  • System.DirectoryServices.Protocols.DirectoryControl の内容を UTF8 でエンコードされた文字列として読み取るとき、無効な UTF8 シーケンスは例外をスローしませんでした。
  • VlvRequestControl のコンストラクターに無効な UTF8 文字列を渡すと、例外はスローされませんでした。

重大な変更ではありませんが、Windows では常に ASN.1 タグが 4 バイトの長さでエンコードされますが、Linux ではタグの長さには必要な数のバイトのみが使用されます。 どちらの表現も有効でしたが、プラットフォーム間のこの動作の違いはなくなりました。Linux の動作が Windows にも表示されるようになりました。

新しい動作

DirectoryControl の解析ははるかに厳しく、プラットフォームとバージョン間で一貫しています。

  • ASN.1 タグがチェックされるようになりました。
  • 末尾のデータは許可されなくなりました。
  • OCTET STRINGSEQUENCEの長さがチェックされるようになりました。
  • 長さ 0 の OCTET STRINGは常に空の文字列を返すようになりました。
  • サーバーが無効な UTF8 バイト シーケンスを送信した場合、System.DirectoryServices.Protocols.DirectoryControl 解析ロジックは、無効な文字を既知の値に自動的に置き換えるのではなく、例外をスローするようになりました。

また、VlvRequestControl コンストラクターを呼び出すときに、エラーをより徹底的に検証します。 UTF8 値としてエンコードできない文字列を渡すと、EncoderFallbackException がスローされるようになりました。

導入されたバージョン

.NET 10 Preview 1

破壊的変更の種類

この変更は、動作の変更です。

変更の理由

この変更は、RFC と仕様のコンプライアンスのために行われました。 MS-ADTS のさまざまな RFC およびセクションでは、controlValue は ASN.1 構造体の BER エンコードとして指定され、次のような表現が使用されます (RFC2891、セクション 1.2)。

controlType は "1.2.840.113556.1.4.474" に設定されています。 重要度は FALSE です (存在しない場合があります)。 controlValue は OCTET STRING であり、その値は次の SEQUENCE の値の BER エンコードです。

これにより、末尾のデータが除外されます。 また、ASN.1 タグが異なる ASN.1 構造体の BER エンコードと無効な BER エンコード (含まれている SEQUENCE よりも長い OCTET STRING など) も除外します。

VlvRequestControl コンストラクターの場合、例外を早期にスローすることは、明示的に指定した値のみがサーバーに送信されることをユーザーが信頼できることを意味します。 有効な UTF8 バイトにエンコードできない文字列を渡したために、誤って EF BF BD をサーバーに送信する状況はありません。

サーバーは RFC と仕様に準拠している必要があります。 VlvRequestControl コンストラクターを呼び出すときは、必ず EncoderFallbackException を処理してください。

影響を受ける API