Megosztás a következőn keresztül:


CA2119: Privát felületeknek megfelelő tömítési módszerek

Tulajdonság Érték
Szabályazonosító CA2119
Cím Privát felületeknek megfelelő tömítési módszerek
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

Az örökölhető nyilvános típus egy (FriendVisual Basic)-felület felülírható metódusát internal biztosítja.

Szabály leírása

A felületi metódusok nyilvános akadálymentességgel rendelkeznek, amelyet a implementálási típus nem módosíthat. A belső interfész létrehoz egy szerződést, amelyet nem kívánnak megvalósítani az interfészt meghatározó szerelvényen kívül. Egy nyilvános típus, amely egy belső felület metódusát implementálja a virtual (Overridable Visual Basic) módosító használatával, lehetővé teszi, hogy a metódust felül lehessen bírálni egy olyan származtatott típussal, amely kívül esik a szerelvényen. Ha a definiáló szerelvény egy második típusa meghívja a metódust, és csak belső szerződésre számít, a viselkedés sérülhet, ha ehelyett a külső szerelvény felülbírált metódusa fut. Ez biztonsági rést hoz létre.

Szabálysértések kijavítása

A szabály megsértésének kijavításához megakadályozza, hogy a metódus felül legyen bírálva a szerelvényen kívül az alábbiak egyikével:

  • Végezze el a deklarálás típusát sealed (NotInheritable a Visual Basicben).

  • Módosítsa a deklarálási típus internal akadálymentességét (Friend a Visual Basicben).

  • Távolítsa el az összes nyilvános konstruktort a deklarálási típusból.

  • Implementálja a metódust a virtual módosító használata nélkül.

  • A metódust explicit módon implementáljuk.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését nyugodtan mellőzheti, ha alapos felülvizsgálat után nem áll fenn olyan biztonsági probléma, amely kihasználható lenne, ha a metódus felülbírálásra kerül a szerelvényen kívül.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Example 1

Az alábbi példa egy olyan típust mutat be, BaseImplementationamely megsérti ezt a szabályt.

// 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

Example 2

Az alábbi példa az előző példa virtuális metódus-implementációját használja ki.

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

Kapcsolódó információk