CA2101 : spécifiez le marshaling pour les arguments de chaîne P/Invoke
Propriété | Value |
---|---|
Identificateur de la règle | CA2101 |
Titre | Spécifier le marshaling pour les arguments de chaîne P/Invoke |
Catégorie | Globalisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Comme suggestion |
Cause
Un membre d’appel de code non managé autorise les appelants dotés d’un niveau de confiance partielle, présente un paramètre de chaîne et ne marshale pas explicitement la chaîne.
Description de la règle
Lorsque vous convertissez d’Unicode en ANSI, il est possible que tous les caractères Unicode ne soient pas représentés dans une page de code ANSI spécifique. Le mappage ajusté tente de résoudre ce problème en remplaçant le caractère qui ne peut pas être représenté par un autre caractère. L’utilisation de cette fonctionnalité peut provoquer une vulnérabilité de sécurité potentielle, car vous ne pouvez pas contrôler le caractère choisi. Par exemple, du code malveillant peut créer intentionnellement une chaîne Unicode qui contient des caractères introuvables dans une page de code particulière, qui sont convertis en caractères spéciaux du système de fichiers tels que « .. » ou « / ». Notez également que des vérifications de sécurité pour les caractères spéciaux se produisent fréquemment avant que la chaîne ne soit convertie en ANSI.
Le mappage ajusté est le comportement par défaut pour la conversion non managée, WChar en MByte. Si vous ne désactivez pas explicitement le mappage ajusté, votre code peut contenir une vulnérabilité de sécurité exploitable en raison de ce problème.
Attention
La sécurité d’accès du code (CAS) ne doit pas être considérée comme une limite de sécurité.
Comment corriger les violations
Pour corriger une violation de cette règle, marshalez explicitement les types de données de chaîne.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L’exemple suivant montre une méthode qui enfreint cette règle, puis montre comment corriger la violation.
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