Partager via


Spécifier le marshaling pour les arguments de chaîne P/Invoke

Mise à jour : novembre 2007

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Catégorie

Microsoft.Globalization

Modification avec rupture

Non

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

Lors de la conversion du format Unicode au format ANSI, il est possible que tous les caractères Unicode ne puissent pas être représentés dans une page de code ANSI spécifique. Le mappage ajusté essaie de résoudre ce problème en substituant un caractère qui ne peut pas être représenté au profit d'un autre. L'utilisation de cette fonctionnalité peut induire une faille de sécurité car vous ne pouvez pas contrôler le caractère choisi. Par exemple, un code malveillant pourrait créer intentionnellement une chaîne Unicode qui contient des caractères non trouvés dans une page de code donnée, qui sont alors convertis en caractères spéciaux du système de fichiers, notamment ' .. ' ou ' / '. Remarquez également que les vérifications de sécurité concernant les caractères spéciaux se produisent fréquemment avant la conversion de la chaîne au format ANSI.

Le mappage ajusté constitue la valeur par défaut pour la conversion non managée, WChar en Mbyte. Sauf désactivation explicite du mappage ajusté, votre code peut présenter une faille de sécurité exploitable du fait de ce problème.

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 présente une méthode qui viole cette règle, puis indique comment corriger la violation.

using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace SecurityLibrary
{
    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);
    }
}