CA2101: P/Invoke string argumentumok kiosztásának megadása

Tulajdonság Érték
Szabályazonosító CA2101
Cím P/Invoke karakterlánc argumentumok elrendezésének megadása
Kategória Globalizáció
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Javaslatként
Alkalmazandó nyelvek C# és Visual Basic

Ok

A platforminvokációs tag lehetővé teszi a részlegesen megbízható hívókat, rendelkezik string paraméterrel, és nem explicit módon kezeli a stringet.

Szabály leírása

Unicode-ról ANSI-vé való konvertáláskor előfordulhat, hogy nem minden Unicode-karakter jelenik meg egy adott ANSI-kódlapon. A legjobban illeszkedő leképezés úgy próbálja megoldani ezt a problémát, hogy egy olyan karaktert helyettesít a karakterrel, amely nem jeleníthető meg. A funkció használata biztonsági rést okozhat, mert nem szabályozhatja a választott karaktert. A rosszindulatú kód például szándékosan létrehozhat egy Unicode-sztringet, amely olyan karaktereket tartalmaz, amelyek nem találhatók egy adott kódlapon, amelyeket a rendszer speciális fájlrendszeri karakterekké alakít át, például a "." karaktert. vagy "/". Vegye figyelembe azt is, hogy a speciális karakterek biztonsági ellenőrzése gyakran előfordul a sztring ANSI-vé alakítása előtt.

A legjobb illesztés az alapértelmezett beállítás a nem felügyelt átalakításban (WChar–MByte esetében). Ha nem tiltotta le kifejezetten a legmegfelelőbb párosítást, a kód esetleg kihasználható biztonsági rést tartalmazhat emiatt a probléma miatt.

Figyelemfelhívás

A kódelérési biztonság (CAS) nem tekinthető biztonsági határnak.

Szabálysértések kijavítása

A szabály megsértésének kijavításához explicit módon meg kell adni a karakterlánc adattípusokat.

Mikor kell letiltani a figyelmeztetéseket?

Ne nyomja el a figyelmeztetést ebből a szabályból.

Példa

Az alábbi példa egy olyan módszert mutat be, amely megsérti ezt a szabályt, majd bemutatja a szabálysértés kijavításának módját.

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