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