Share via


CA2101: Marshalling opgeven voor P/Invoke-tekenreeksargumenten

Eigenschappen Weergegeven als
Regel-id CA2101
Titel Marshalling opgeven voor tekenreeksargumenten voor P/Aanroepen
Categorie Globalisatie
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Een lid dat een platform aanroept, maakt gedeeltelijk vertrouwde aanroepers mogelijk, heeft een tekenreeksparameter en geeft niet expliciet een marshal van de tekenreeks.

Beschrijving van regel

Wanneer u converteert van Unicode naar ANSI, is het mogelijk dat niet alle Unicode-tekens kunnen worden weergegeven op een specifieke ANSI-codepagina. De best passende toewijzing probeert dit probleem op te lossen door een teken te vervangen door het teken dat niet kan worden weergegeven. Het gebruik van deze functie kan een mogelijk beveiligingsprobleem veroorzaken omdat u het gekozen teken niet kunt beheren. Schadelijke code kan bijvoorbeeld opzettelijk een Unicode-tekenreeks maken die tekens bevat die niet worden gevonden op een bepaalde codepagina, die worden geconverteerd naar speciale tekens van het bestandssysteem, zoals '.' of '/'. Houd er ook rekening mee dat beveiligingscontroles op speciale tekens vaak plaatsvinden voordat de tekenreeks wordt geconverteerd naar ANSI.

De beste toewijzing is de standaardwaarde voor de niet-beheerde conversie WChar naar MByte. Tenzij u expliciet de best passende toewijzing uitschakelt, bevat uw code mogelijk een beveiligingsprobleem dat kan worden misbruikt vanwege dit probleem.

Let op

Code Access Security (CAS) mag niet worden beschouwd als een beveiligingsgrens.

Schendingen oplossen

U kunt een schending van deze regel oplossen door expliciet marshal string-gegevenstypen op te lossen.

Wanneer waarschuwingen onderdrukken

Een waarschuwing van deze regel niet onderdrukken.

Opmerking

In het volgende voorbeeld ziet u een methode die deze regel schendt en ziet u hoe u de schending kunt oplossen.

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