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

Proprietà valore
ID regola CA2101
Title Specificare il marshalling per gli argomenti stringa P/Invoke
Categoria Globalizzazione
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Un membro platform invoke consente ai chiamanti parzialmente attendibili, 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. Il mapping ottimale tenta di risolvere questo problema sostituendo un carattere per 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.

Il mapping ottimale è 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

La sicurezza dall'accesso di codice non deve essere considerata un limite di sicurezza.

Come correggere le violazioni

Per correggere una violazione di questa regola, effettuare il marshalling esplicito dei tipi di dati stringa.

Quando eliminare gli avvisi

Non escludere 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