TypeName |
PInvokesShouldNotBeSafeCriticalFxCopRule |
CheckId |
CA5122 |
类别 |
Microsoft.Security |
是否重大更改 |
重大 |
原因
A P/Invoke 声明已标记有 SecuritySafeCriticalAttribute:
[assembly: AllowPartiallyTrustedCallers]
// ...
public class C
{
[SecuritySafeCritical]
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration); // CA5122 – safe critical p/invoke
}
在本例中,C.Beep(...) 已标记为安全可靠关键的方法。
规则说明
当方法执行安全敏感性操作时,将被标记为 SecuritySafeCritical,但透明代码使用它们也是安全的。安全透明度模型的一个基本规则是透明代码可能从不通过 P/Invoke 直接调用本机代码。因此,将 P/Invoke 标记为安全关键将使透明代码无法调用它,并且会误导安全分析。
如何解决冲突
若要使 P/Invoke 可用于透明代码,请为之公开安全可靠关键的包装器方法:
[assembly: AllowPartiallyTrustedCallers
class C
{
[SecurityCritical]
[DllImport(“kernel32.dll”, EntryPoint=”Beep”)]
private static extern bool BeepPinvoke(int frequency, int duration); // Security Critical P/Invoke
[SecuritySafeCritical]
public static bool Beep(int frequency, int duration)
{
return BeepPInvoke(frequency, duration);
}
}
何时禁止显示警告
不禁止显示此规则发出的警告。