Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Valeur |
|---|---|
| Identificateur de la règle | CA2101 |
| Titre | Spécifiez le marshaling pour les arguments de type chaîne dans P/Invoke |
| Catégorie | Globalisation |
| Le correctif a un effet disruptif ou non disruptif | Sans rupture |
| Activé par défaut dans .NET 10 | À titre de suggestion |
| Langues applicables | C# et Visual Basic |
Cause
Un membre de l'appel plateforme autorise les appelants avec un niveau de confiance partielle, comporte un paramètre de chaîne de caractères et ne marshale pas explicitement la chaîne de caractères.
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 le mieux adapté tente de résoudre ce problème en substituant un caractère à celui qui ne peut pas être représenté. 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 au mieux ajusté est le comportement par défaut pour la conversion non gérée, de WChar en MByte. Si vous ne désactivez pas explicitement le mappage de meilleur ajustement, votre code peut contenir une vulnérabilité de sécurité exploitable dû à 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 pas un avertissement provenant 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