分享方式:


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

屬性
規則識別碼 CA3077
標題 API 設計、XML 文件和 XML 文字讀取器中的不安全處理
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

針對衍生自 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) 攻擊。 下列情況會觸發此規則:

  • XmlDocumentXmlTextReader 類別會使用預設解析程式值來處理 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;
        }
    }
}