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 |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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