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
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 (NotInheritable Visual Basic'te) yapın.

  • Deklarasyon türünün erişilebilirliğini internal olarak değiştirin (Visual Basic'te Friend).

  • 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, 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

Ayrıca bkz.