CA2101 : spécifiez le marshaling pour les arguments de chaîne P/Invoke

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