Share via


CA2101: Ange marshalling för P/Invoke-strängargument

Property Värde
Regel-ID CA2101
Title Ange marshalling för P/Invoke-strängargument
Kategori Globalisering
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En plattformsanropsmedlem tillåter delvis betrodda anropare, har en strängparameter och konverterar inte strängen uttryckligen.

Regelbeskrivning

När du konverterar från Unicode till ANSI är det möjligt att inte alla Unicode-tecken kan representeras på en specifik ANSI-kodsida. Mappning med bästa passform försöker lösa det här problemet genom att ersätta ett tecken med det tecken som inte kan representeras. Användningen av den här funktionen kan orsaka en potentiell säkerhetsrisk eftersom du inte kan styra det tecken som väljs. Skadlig kod kan till exempel avsiktligt skapa en Unicode-sträng som innehåller tecken som inte finns på en viss kodsida, som konverteras till filsystemets specialtecken, till exempel .. eller "/". Observera också att säkerhetskontroller för specialtecken ofta utförs innan strängen konverteras till ANSI.

Best-fit-mappning är standardvärdet för ohanterad konvertering, WChar till MByte. Om du inte uttryckligen inaktiverar mappning med bästa passform kan koden innehålla en sårbarhet som kan utnyttjas på grund av det här problemet.

Varning

Code Access Security (CAS) bör inte betraktas som en säkerhetsgräns.

Så här åtgärdar du överträdelser

Åtgärda ett brott mot den här regeln genom att uttryckligen konvertera strängdatatyper.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Exempel

I följande exempel visas en metod som bryter mot den här regeln och visar sedan hur du åtgärdar överträdelsen.

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