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