CA2119:密封方法以滿足私用介面的要求
屬性 | 值 |
---|---|
規則識別碼 | CA2119 |
標題 | 密封方法以滿足私用介面的要求 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 中斷 |
預設在 .NET 8 中啟用 | No |
原因
可繼承的公用型別提供 (Friend
在 Visual Basic 中) 介面的可覆寫方法實作internal
。
檔案描述
介面方法具有公用輔助功能,無法由實作類型變更。 內部介面會建立一個合約,該合約不適合在定義介面的元件外部實作。 使用 (Overridable
在 Visual Basic 中) 修飾詞實作內部介面virtual
方法的公用型別,可讓元件外部的衍生型別覆寫 方法。 如果定義元件中的第二個類型呼叫 方法,並預期只有內部合約,則當外部元件中覆寫的方法執行時,行為可能會遭到入侵。 這會建立安全性弱點。
如何修正違規
若要修正此規則的違規,請使用下列其中一項,防止方法覆寫元件外部:
建立宣告類型
sealed
(NotInheritable
在 Visual Basic 中)。將宣告類型的輔助功能變更為
internal
(Friend
在 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