Freigeben über


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

Eigenschaft Wert
Regel-ID CA2101
Titel Marshalling für „P/Invoke“-Zeichenfolgenargumente festlegen
Kategorie Globalisierung
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Als Vorschlag
Anwendbare Sprachen C# und Visual Basic

Ursache

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

Regelbeschreibung

Wenn Sie von Unicode in ANSI konvertieren, ist es möglich, dass nicht alle Unicode-Zeichen in einer bestimmten ANSI-Codepage dargestellt werden können. Die Best-Fit-Zuordnung versucht, dieses Problem zu lösen, indem ein Zeichen ersetzt wird, das nicht dargestellt werden kann. Dieses Feature kann ein potenzielles Sicherheitsrisiko darstellen, da Sie nicht steuern können, welches Zeichen ausgewählt wird. Beispielsweise könnte schädlicher Code absichtlich eine Unicode-Zeichenfolge erstellen, die Zeichen enthält, die in einer bestimmten Codepage nicht vorkommen und die dann in dateisystemspezifische Sonderzeichen wie „..“ umgewandelt werden. oder "/" Beachten Sie auch, dass für Sonderzeichen regelmäßig Sicherheitsüberprüfungen durchgeführt werden, bevor die Zeichenfolge in ANSI konvertiert wird.

Die Best-Fit-Zuordnung ist die Standardeinstellung für die nicht verwaltete Konvertierung von WChar zu MByte. Wenn Sie die best-fit Zuordnung nicht explizit deaktivieren, kann Ihr Code aufgrund dieses Problems eine ausnutzbare Sicherheitslücke enthalten.

Achtung

Die Codezugriffssicherheit (Code Access Security, CAS) sollte nicht als Sicherheitsgrenze betrachtet werden.

So beheben Sie Verstöße

Führen Sie ein explizites Marshalling für Zeichenfolgen-Datentypen durch, um einen Verstoß dieser Regel zu korrigieren.

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, und die Korrektur dieses Verstoßes.

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