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 9 | 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