Freigeben über


CA2101: Marshalling für P/Invoke-Zeichenfolgenargumente festlegen

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Kategorie

Microsoft.Globalization

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Plattformaufrufmember lässt teilweise vertrauenswürdige Aufrufer zu, enthält einen Zeichenfolgenparameter und führt kein explizites Marshalling der Zeichenfolge durch.

Regelbeschreibung

Bei der Konvertierung von Unicode in ANSI können eventuell nicht alle Unicode-Zeichen mit einer bestimmten ANSI-Codepage dargestellt werden. Dieses Problem soll durch die optimale Zuordnung gelöst werden, bei der das nicht darstellbare Zeichen durch ein Zeichen ersetzt wird. Die Verwendung dieses Features stellt unter Umständen eine Sicherheitslücke dar, da Sie nicht bestimmen können, welches Zeichen ausgewählt wird. Durch böswilligen Code könnte z. B. absichtlich eine Unicode-Zeichenfolge mit Zeichen erstellt werden, die auf einer bestimmten Codepage nicht enthalten sind und die in dateisystemspezifische Zeichen wie '..' oder '/' konvertiert werden. Beachten Sie auch, dass Sicherheitsüberprüfungen bei Sonderzeichen häufig vor der Konvertierung der Zeichenfolge in ANSI erfolgen.

Die optimale Zuordnung ist die Standardeinstellung für die nicht verwaltete Konvertierung von WChar in MByte. Wenn Sie die optimale Zuordnung nicht explizit deaktivieren, kann der Code aufgrund dieses Problems eine ausnutzbare Sicherheitslücke enthalten.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, führen Sie ein explizites Marshalling von Zeichenfolgendatentypen aus.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Das folgende Beispiel zeigt eine Methode, die gegen diese Regel verstößt. Danach wird dargestellt, wie der Verstoß behoben wird.

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);
    }
}