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 oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

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 Zuordnung mit ähnlichen Zeichen versucht, dieses Problem durch Ersetzung eines Zeichens zu beheben, 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 nicht in der jeweiligen Codepage enthaltene Zeichen aufweist, die dann in dateisystemspezifische Sonderzeichen wie „..“ oder „/“ konvertiert werden. Beachten Sie auch, dass für Sonderzeichen regelmäßig Sicherheitsüberprüfungen durchgeführt werden, bevor die Zeichenfolge in ANSI konvertiert wird.

Die Zuordnung mit ähnlichen Zeichen wird standardmäßig bei der nicht verwalteten Konvertierung (WChar in MByte) eingesetzt. Wenn Sie die Zuordnung mit ähnlichen Zeichen nicht explizit deaktivieren, kann Ihr Code aufgrund dieses Problems ein ausnutzbares Sicherheitsrisiko darstellen.

Achtung

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

Behandeln von Verstößen

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