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