Condividi tramite


CA2101: Specificare il marshalling per gli argomenti di tipo stringa P/Invoke

Proprietà valore
ID regola CA2101
Title Specificare il marshalling per gli argomenti stringa P/Invoke
Categoria Globalizzazione
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 Come suggerimento
Linguaggi applicabili C# e Visual Basic

Causa

Un membro di invocazione della piattaforma consente ai chiamanti con attendibilità parziale, ha un parametro stringa e non effettua il marshalling esplicito della stringa.

Descrizione regola

Quando si esegue la conversione da Unicode a ANSI, è possibile che non tutti i caratteri Unicode possano essere rappresentati in una tabella codici ANSI specifica. La mappatura più adeguata tenta di risolvere questo problema sostituendo un carattere con il carattere che non può essere rappresentato. L'uso di questa funzionalità può causare una potenziale vulnerabilità di sicurezza perché non è possibile controllare il carattere scelto. Ad esempio, il codice dannoso potrebbe creare intenzionalmente una stringa Unicode contenente caratteri non trovati in una determinata tabella codici, che vengono convertiti in caratteri speciali del file system, ad esempio '.' o '/'. Si noti anche che i controlli di sicurezza per i caratteri speciali si verificano frequentemente prima che la stringa venga convertita in ANSI.

La mappatura migliore è l'impostazione predefinita per la conversione non gestita, da WChar a MByte. A meno che non si disabiliti in modo esplicito il mapping ottimale, il codice potrebbe contenere una vulnerabilità di sicurezza sfruttabile a causa di questo problema.

Attenzione

Sicurezza dell'accesso al codice (CAS) non deve essere considerata un confine di sicurezza.

Come correggere le violazioni

Effettuate esplicitamente il marshaling dei tipi di dati stringa per correggere una violazione di questa regola.

Quando eliminare gli avvisi

Non sopprimere un avviso da questa regola.

Esempio

Nell'esempio seguente viene illustrato un metodo che viola questa regola e viene quindi illustrato come correggere la violazione.

class NativeMethods
{
    // Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);

    // Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
    internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
}
Friend Class NativeMethods
    ' Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Auto)>
    Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function

    ' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)>
    Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function
End Class