CA3077:API 設計、XML 文件和 XML 文字讀取器中的不安全處理

屬性 值
規則識別碼 CA3077
職稱 API 設計、XML 文件和 XML 文字讀取器中的不安全處理
類別 安全性
修正程式是中斷或非中斷 不間斷
在 .NET 10 中預設啟用 No
適用語言 C# 與 Visual Basic

原因

針對衍生自 XMLDocument 和 XMLTextReader 的 API 進行設計時,請留意 DtdProcessing。 若在參考或解析外部實體來源時使用不安全的 DTDProcessing 執行個體,或在 XML 中設定不安全的值,都可能會導致資訊洩漏。

規則描述

文件類型定義 (DTD) 是 World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0中針對 XML 剖析器用來判斷文件有效性所定義之兩種方式的其中一種。 此規則會搜尋已接受不受信任之資料的屬性和執行個體,藉此警告開發人員潛在的 Information Disclosure 威脅,這些威脅可能會導致 Denial of Service (DoS) 攻擊。 下列情況會觸發此規則:

  • XmlDocument 或 XmlTextReader 類別會使用預設解析程式值來處理 DTD 。

  • 未針對 XmlDocument 或 XmlTextReader 衍生的類別定義任何建構函式,或在 XmlResolver中使用不安全的值。

如何修正違規

  • 攔截並處理所有 XmlTextReader 例外狀況,以避免路徑資訊洩漏 。

  • 使用 XmlSecureResolver而不是 XmlResolver 來限制 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;
        }
    }
}