在我的代码中获取安全警告

时间:2016-04-20 09:38:10

标签: c# asp.net .net dll

我在VS 2013中运行了我的项目的代码分析,并在安全警告下面找到了。

CA5122 P / Invoke声明不应该是安全关键的。 P / Invoke方法' InfoParameters.GetVolumeInformationInvoke(字符串,StringBuilder,uint,out uint,out uint,out uint,StringBuilder,uint)'被标记为安全关键。由于P / Invokes只能由关键代码调用,因此该声明应标记为安全关键,或者完全删除其注释以避免误导。 AmericanEPayWebPunch PunchInOutBLL.cs 785

enter image description here

代码如下

class InfoParameters
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size);

}

因此,根据MS在https://msdn.microsoft.com/en-in/library/dn621099.aspx上提供的文档,我为我的方法创建了一个包装器方法,但仍然遇到同样的问题

[assembly: System.Security.AllowPartiallyTrustedCallers]
internal static class SafeNativeMethods
{
    [System.Security.SecurityCritical]
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "GetVolumeInformation")]
    internal static extern bool GetVolumeInformationInvoke(string volume, StringBuilder volumeName, uint volumeNameSize,
        out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder fs, uint fsSize);
}

class InfoParameters
{
    [SecuritySafeCritical]
    public static bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size)
    {
        return SafeNativeMethods.GetVolumeInformationInvoke(Volume, VolumeName, VolumeNameSize, out SerialNumber, out SerialNumberLength, out flags, fs, fs_size);
    }
}

我尝试了@Lucca提出的建议仍然得到同样的警告。见下面的截图。 enter image description here

1 个答案:

答案 0 :(得分:0)

如果您使用SecuritySafeCritical属性来正确管理任何最终不安全的程序集调用的安全性,则需要SecurityCritical[assembly: AllowPartiallyTrustedCallers]属性。如果您不需要AllowPartiallyTrustedCallers删除它,警告就会消失。

这是实际在这里工作的代码(无论如何,仍有一些关于编组的警告):

internal static class SafeNativeMethods
{
    [SecurityCritical]
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "GetVolumeInformation")]
    internal static extern bool GetVolumeInformationInvoke(string volume, StringBuilder volumeName, uint volumeNameSize,
        out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder fs, uint fsSize);
}

[SecuritySafeCritical]
public static bool GetVolumeInformation(string Volume, StringBuilder VolumeName, uint VolumeNameSize, out uint SerialNumber, out uint SerialNumberLength, out uint flags, StringBuilder fs, uint fs_size)
{
    return SafeNativeMethods.GetVolumeInformationInvoke(Volume, VolumeName, VolumeNameSize, out SerialNumber, out SerialNumberLength, out flags, fs, fs_size);
}