CA2101: Marshalling opgeven voor P/Invoke-tekenreeksargumenten

Eigenschap Waarde
Regel-id CA2101
Titel Marshalling specificeren voor P/Invoke-strings argumenten
Categorie Globalisatie
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

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 voor een 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.

Best-fit mapping is de standaardinstelling voor de niet-beheerde conversie van 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.

Hoe schendingen op te lossen

U kunt een schending van deze regel verhelpen door stringgegevens types expliciet te marshallen.

Wanneer waarschuwingen onderdrukken

Een waarschuwing van deze regel niet onderdrukken.

Voorbeeld

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