CA2119: Impostare come sealed i metodi che soddisfano interfacce private
Proprietà | valore |
---|---|
ID regola | CA2119 |
Title | Impostare come sealed i metodi che soddisfano interfacce private |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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