Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| 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