Megosztás a következőn keresztül:


CA2101: P/Invoke sztringargumentumok rendezési beállításának megadása

Tulajdonság Érték
Szabályazonosító CA2101
Cím P/Invoke sztringargumentumok rendezési beállításának megadása
Kategória Globalizáció
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

A platformmeghívó tag lehetővé teszi a részlegesen megbízható hívók használatát, rendelkezik sztringparaméterrel, és nem teszi explicit módon a sztringet.

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 legjobban illeszkedő leképezés a nem felügyelt átalakítás( WChar– MByte) alapértelmezett beállítása. Ha nem tiltja le kifejezetten a legjobban illeszkedő leképezést, előfordulhat, hogy a kód biztonsági rést tartalmaz a probléma miatt.

Figyelem

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 marshal sztring adattípusokat kell megadni.

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa el a szabály figyelmeztetését.

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