CA2119: Impostare come sealed i metodi che soddisfano interfacce private

Proprietà valore
ID regola CA2119
Titolo Impostare come sealed i metodi che soddisfano interfacce private
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un tipo pubblico ereditabile fornisce un'implementazione di metodo sottoponibile a override di un'interfaccia internal (Friend in Visual Basic).

Descrizione regola

I metodi di interfaccia hanno accessibilità pubblica, che non può essere modificata dal tipo di implementazione. Un'interfaccia interna crea un contratto che non deve essere implementato all'esterno dell'assembly che definisce l'interfaccia. Un tipo pubblico che implementa un metodo di un'interfaccia interna utilizzando il virtual modificatore (Overridable in Visual Basic) consente di eseguire l'override del metodo da un tipo derivato esterno all'assembly. Se un secondo tipo nell'assembly che definisce chiama il metodo e prevede un contratto solo interno, il comportamento potrebbe essere compromesso quando, invece, viene eseguito il metodo sottoposto a override nell'assembly esterno. In questo modo viene creata una vulnerabilità di sicurezza.

Come correggere le violazioni

Per correggere una violazione di questa regola, impedire che il metodo venga sottoposto a override all'esterno dell'assembly utilizzando uno dei seguenti elementi:

  • Impostare il tipo sealed dichiarante (NotInheritable in Visual Basic).

  • Modificare l'accessibilità del tipo dichiarante in internal (Friend in Visual Basic).

  • Rimuovere tutti i costruttori pubblici dal tipo dichiarante.

  • Implementare il metodo senza usare il virtual modificatore.

  • Implementare il metodo in modo esplicito.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se, dopo un'attenta revisione, non esistono problemi di sicurezza che potrebbero essere sfruttabili se il metodo viene sottoposto a override all'esterno dell'assembly.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio 1

Nell'esempio seguente viene illustrato un tipo , BaseImplementation, che viola questa regola.

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

Esempio 2

Nell'esempio seguente viene sfruttata l'implementazione del metodo virtuale dell'esempio precedente.

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

Vedi anche