CA2101: Należy określić operacje organizacyjne dla argumentów typu string P/Invoke
TypeName |
SpecifyMarshalingForPInvokeStringArguments |
CheckId |
CA2101 |
Kategoria |
Microsoft.Globalization |
Złamanie zmiany |
Bez podziału |
Przyczyna
Platforma wywołać Członkowskie zezwala na częściowo zaufanych wywołań ma parametr typu string i wyraźnie nie MARSZAŁEK ciąg.
Opis reguły
Podczas konwersji ze standardu Unicode na ANSI jest możliwe, że nie wszystkie znaki Unicode może być reprezentowana w określonej strony kodowej ANSI.Mapowanie liniowego próbuje rozwiązać ten problem wstawiając znak dla znaku, który nie może być reprezentowana.Użycie tej funkcji może spowodować potencjalną lukę w zabezpieczeniach, ponieważ nie można kontrolować znak, który jest wybrany.Na przykład złośliwy kod może celowo tworzyć ciąg Unicode, który zawiera znaki, które nie znajdują się w stronę określonego kodu, które są konwertowane na system plików, znaki specjalne, takie jak '..' lub '/'.Należy również zauważyć, że kontrole bezpieczeństwa dla znaków specjalnych często występują przed ciąg jest konwertowany na ANSI.
Mapowanie najlepszego dopasowania jest domyślna dla konwersji niezarządzanego WChar do MBajtów.O ile jawnie wyłącz mapowanie liniowego, kod może zawierać luki w zabezpieczeniach kończona z powodu tego problemu.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, wyraźnie MARSZAŁEK ciąg typów danych.
Kiedy do pomijania ostrzeżenia
Nie pomijaj ostrzeżenie od tej reguły.
Przykład
W poniższym przykładzie metoda, która narusza reguły i pokazuje, jak naprawić naruszenia.
using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]
namespace SecurityLibrary
{
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);
}
}