CA3077:API のデザイン、XML ドキュメント、および XML テキスト リーダーでの安全ではない処理

プロパティ
ルール ID CA3077
Title API のデザイン、XML ドキュメント、および XML テキスト リーダーでの安全ではない処理
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

XMLDocument と XMLTextReader から派生する API をデザインする場合、 DtdProcessingにご注意ください。 外部エンティティ ソースを参照または解決したり、XML に安全ではない値を設定したりする場合に、安全ではない DTDProcessing インスタンスを使用すると、情報漏えいにつながる可能性があります。

規則の説明

文書型定義 (DTD) は、World Wide Web コンソーシアム (W3C) Extensible Markup Language (XML) 1.0 で定義されているように、XML パーサーが文書の妥当性を判別する 2 つの方法のうちの 1 つです。 このルールは、信頼されていないデータを受け入れてしまうプロパティとインスタンスを検索し、 サービス拒否 (DoS) 攻撃につながる可能性がある潜在的な Information Disclosure の脅威について開発者に警告します。 このルールは、次の場合にトリガーされます。

  • XmlDocument または XmlTextReader クラスがリゾルバーの既定値を DTD の処理に使用している。

  • XmlDocument または XmlTextReader から派生したクラスにコンストラクターが定義されていない。または XmlResolverにセキュリティで保護された値が使用されていない。

違反の修正方法

  • パス情報の漏えいを防ぐために、XmlTextReader 例外をすべてキャッチし、適切に処理します。

  • XmlResolver の代わりに XmlSecureResolver を使用して、XmlTextReader がアクセスできるリソースを制限します。

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

入力が信頼できるソースからのものとわかっているのでない限り、この警告からのルールを抑制しないでください。

警告を抑制する

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

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

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

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

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

疑似コードの例

違反

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

解決策

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}