分享方式:


CA2119:密封方法以滿足私用介面的要求

屬性
規則識別碼 CA2119
標題 密封方法以滿足私用介面的要求
類別 安全性
修正程式是中斷或非中斷 中斷
預設在 .NET 8 中啟用 No

原因

可繼承的公用型別提供 (Friend在 Visual Basic 中) 介面的可覆寫方法實作internal

檔案描述

介面方法具有公用輔助功能,無法由實作類型變更。 內部介面會建立一個合約,該合約不適合在定義介面的元件外部實作。 使用 (Overridable在 Visual Basic 中) 修飾詞實作內部介面virtual方法的公用型別,可讓元件外部的衍生型別覆寫 方法。 如果定義元件中的第二個類型呼叫 方法,並預期只有內部合約,則當外部元件中覆寫的方法執行時,行為可能會遭到入侵。 這會建立安全性弱點。

如何修正違規

若要修正此規則的違規,請使用下列其中一項,防止方法覆寫元件外部:

  • 建立宣告類型 sealedNotInheritable 在 Visual Basic 中)。

  • 將宣告類型的輔助功能變更為 internalFriend 在 Visual Basic 中)。

  • 從宣告類型中移除所有公用建構函式。

  • 實作 方法,而不使用 virtual 修飾詞。

  • 明確實作 方法。

隱藏警告的時機

如果仔細檢閱之後,如果方法覆寫在元件外部,則隱藏此規則的警告是安全的。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

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

若要停用檔案、資料夾或項目的規則,請在組態檔中將其嚴重性設定為 。none

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

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

範例 1

下列範例顯示違反此規則的類型 BaseImplementation

// Internal by default.
interface IValidate
{
    bool UserIsValidated();
}

public class BaseImplementation : IValidate
{
    public virtual bool UserIsValidated()
    {
        return false;
    }
}

public class UseBaseImplementation
{
    public void SecurityDecision(BaseImplementation someImplementation)
    {
        if (someImplementation.UserIsValidated() == true)
        {
            Console.WriteLine("Account number & balance.");
        }
        else
        {
            Console.WriteLine("Please login.");
        }
    }
}
Interface IValidate
    Function UserIsValidated() As Boolean
End Interface

Public Class BaseImplementation
    Implements IValidate

    Overridable Function UserIsValidated() As Boolean _
     Implements IValidate.UserIsValidated
        Return False
    End Function

End Class

Public Class UseBaseImplementation

    Sub SecurityDecision(someImplementation As BaseImplementation)

        If (someImplementation.UserIsValidated() = True) Then
            Console.WriteLine("Account number & balance.")
        Else
            Console.WriteLine("Please login.")
        End If

    End Sub

End Class

範例 2

下列範例會利用上一個範例的虛擬方法實作。

public class BaseImplementation
{
    public virtual bool UserIsValidated()
    {
        return false;
    }
}

public class UseBaseImplementation
{
    public void SecurityDecision(BaseImplementation someImplementation)
    {
        if (someImplementation.UserIsValidated() == true)
        {
            Console.WriteLine("Account number & balance.");
        }
        else
        {
            Console.WriteLine("Please login.");
        }
    }
}
Public Class BaseImplementation

    Overridable Function UserIsValidated() As Boolean
        Return False
    End Function

End Class

Public Class UseBaseImplementation

    Sub SecurityDecision(someImplementation As BaseImplementation)

        If (someImplementation.UserIsValidated() = True) Then
            Console.WriteLine("Account number & balance.")
        Else
            Console.WriteLine("Please login.")
        End If

    End Sub

End Class

另請參閱