Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA2119 |
| Başlık | Özel arabirimleri karşılayan metotları mühürleyin |
| Kategori | Güvenlik |
| Düzeltme bozucu ya da bozmayan olabilir | Son Dakika |
| .NET 10'da varsayılan olarak etkin | Hayır |
| Geçerli diller | C# ve Visual Basic |
Neden
Devralınabilir genel tür, bir internal (Friend Visual Basic'te) arabiriminin geçersiz kılınabilir yöntem uygulamasını 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. (virtual Visual Basic'te) değiştiricisini Overridable 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(NotInheritableVisual Basic'te) yapın.Deklarasyon türünün erişilebilirliğini
internalolarak değiştirin (Visual Basic'teFriend).Bildirim türünden tüm ortak oluşturucuları kaldırın.
değiştiricisini kullanmadan
virtualyöntemini uygulayın.yöntemini açıkça uygulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Dikkatli bir incelemeden sonra, eğer yöntem derlemenin dışında geçersiz kılındığında yararlanılabilecek bir güvenlik açığı yoksa, bu kuraldan gelen bir uyarıyı görmezden gelmek 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 noneolarak 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, BaseImplementationbu 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