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 8'de 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 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.