CA2119: Özel arabirimleri karşılayan yöntemleri mühürleyin
Özellik | Değer |
---|---|
Kural Kimliği | CA2119 |
Başlık | Özel arabirimleri karşılayan metotları mühürleyin |
Kategori | Güvenlik |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Devralınabilir genel tür, (Friend
Visual Basic'te) arabiriminin geçersiz kılınabilir bir internal
yöntem uygulaması sağlar.
Kural açıklaması
Arabirim yöntemleri genel erişilebilirliğe sahiptir ve uygulama türü tarafından değiştirilemez. İç arabirim, arabirimi tanımlayan derleme dışında uygulanması amaçlanmamış bir sözleşme oluşturur. (Overridable
Visual Basic'te) değiştiricisini virtual
kullanarak bir iç arabirimin yöntemini uygulayan genel tür, yöntemin derlemenin dışındaki türetilmiş bir tür tarafından geçersiz kılınmasını sağlar. Tanımlama derlemesindeki ikinci bir tür yöntemini çağırır ve yalnızca iç sözleşme beklerse, bunun yerine dış derlemedeki geçersiz kılınan yöntem yürütülürken davranış tehlikeye girebilir. Bu, bir güvenlik açığı oluşturur.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için aşağıdakilerden birini kullanarak yöntemin derleme dışında geçersiz kılınmasını engelleyin:
Bildirim türünü
sealed
(NotInheritable
Visual Basic'te) yapın.Bildirim türünün
internal
erişilebilirliğini (Friend
Visual Basic'te) olarak değiştirin.Bildirim türünden tüm ortak oluşturucuları kaldırın.
değiştiricisini kullanmadan
virtual
yöntemini uygulayın.yöntemini açıkça uygulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Dikkatli bir incelemeden sonra, yöntem derlemenin dışında geçersiz kılınırsa yararlanılabilir bir güvenlik sorunu yoksa, bu kuraldan gelen bir uyarıyı bastırmak güvenlidir.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek 1
Aşağıdaki örnekte, BaseImplementation
bu kuralı ihlal eden bir türü gösterilmektedir.
// 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
Örnek 2
Aşağıdaki örnek, önceki örneğin sanal yöntem uygulamasından yararlanıyor.
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