CA5369:逆シリアル化に XmlReader を使用します

プロパティ
ルール ID CA5369
Title 逆シリアル化に XmlReader を使用します
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

XmlReader オブジェクトを使用せずにインスタンス化された XmlSerializer.Deserialize クラスを使用して信頼されていない XML 入力を逆シリアル化すると、サービス拒否、情報漏えい、サーバー側のリクエスト フォージェリ攻撃につながる可能性があります。 これらの攻撃は、XML に XML 爆弾や悪意のある外部エンティティを含めることができる、信頼されていない DTD および XML スキーマ処理によって有効になります。 XmlReader を使用する場合のみ、DTD を無効にすることができます。 XmlReader としてのインライン XML スキーマ処理では、.NET Framework バージョン 4.0 以降、既定で ProhibitDtd および ProcessInlineSchema プロパティが false に設定されます。 StreamTextReaderXmlSerializationReader などのその他のオプションでは、DTD 処理を無効にできません。

規則の説明

信頼されていない DTD と XML スキーマを処理すると、危険な外部参照を読み込むことができる可能性があります。XmlReader を安全なリゾルバーと共に使用するか、DTD と XML インライン スキーマ処理を無効にして使用することにより、この処理を制限する必要があります。 この規則では、XmlSerializer.Deserialize メソッドを使用し、XmlReader をコンストラクター パラメーターとして受け取らないコードを検出します。

違反の修正方法

Deserialize(XmlReader)Deserialize(XmlReader, String)Deserialize(XmlReader, XmlDeserializationEvents)、または Deserialize(XmlReader, String, XmlDeserializationEvents) 以外の XmlSerializer.Deserialize オーバーロードを使用しないでください。

どのようなときに警告を抑制するか

解析される XML が信頼されているソースからであるため、改ざんの可能性がない場合、この警告を抑制できる可能性があります。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA5369
// The code that's violating the rule is on this line.
#pragma warning restore CA5369

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA5369.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

疑似コードの例

違反

次の擬似コード サンプルでは、この規則により検出されたパターンを示しています。 XmlSerializer.Deserialize の最初のパラメーターの型が、XmlReader またはその派生クラスではありません。

using System.IO;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass).Deserialize(new FileStream("filename", FileMode.Open));

解決策

using System.IO;
using System.Xml;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass)).Deserialize(XmlReader.Create (new FileStream("filename", FileMode.Open)));