C# 在我的代码中获取安全警告
我在VS2013中对我的项目进行代码分析,发现以下安全警告 CA5122 p/Invoke声明不应是安全关键的。P/Invoke方法“InfoParameters.GetVolumeInformationInvoke(字符串、StringBuilder、uint、out uint、out uint、out uint、StringBuilder、uint)”被标记为安全关键。由于P/Invokes只能由关键代码调用,因此应该将此声明标记为安全关键,或者将其注释完全删除以避免误导。AmericanEPayWebPunch PunchInOutBLL.cs 785 对于以下代码C# 在我的代码中获取安全警告,c#,asp.net,.net,dll,C#,Asp.net,.net,Dll,我在VS2013中对我的项目进行代码分析,发现以下安全警告 CA5122 p/Invoke声明不应是安全关键的。P/Invoke方法“InfoParameters.GetVolumeInformationInvoke(字符串、StringBuilder、uint、out uint、out uint、out uint、StringBuilder、uint)”被标记为安全关键。由于P/Invokes只能由关键代码调用,因此应该将此声明标记为安全关键,或者将其注释完全删除以避免误导。AmericanE
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);
}
因此,根据mson提供的文档,我为我的方法创建了一个包装器方法,但仍然遇到同样的问题
[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给出的建议,仍然得到了同样的警告。请参见下面的屏幕截图。
如果使用
[assembly:AllowPartiallyTrustedCallers]
属性来正确管理任何最终不安全的程序集调用的安全性,则需要SecuritySafeCritical
和SecurityCritical
属性。如果不需要AllowPartiallyTrustedCallers
将其删除,警告将消失
这就是这里实际工作的代码(无论如何,仍然有一些关于编组的警告):
如果要使用
[assembly:AllowPartiallyTrustedCallers]
属性正确管理任何最终不安全的程序集调用的安全性,则需要SecuritySafeCritical
和SecurityCritical
属性。如果不需要AllowPartiallyTrustedCallers
将其删除,警告将消失
这就是这里实际工作的代码(无论如何,仍然有一些关于编组的警告):
检查已尝试相同,我在我的question@MusicLovingIndianGirl-这不是已经从他们的问题中间联系起来了吗?是否有你认为OP遗漏的具体建议?如果是这样的话,就值得强调细节,而不是说“请阅读您说过已经阅读过的页面”,这真的是一个ASP.NET web应用程序吗?然后您会遇到安全问题,因为您的应用程序上下文可能不允许运行内核函数。是的,这是一个正在工作/运行的Asp.Net web应用程序检查已尝试相同的方法,我在question@MusicLovingIndianGirl-这不是已经从他们的问题中间联系起来了吗?是否有你认为OP遗漏的具体建议?如果是这样的话,就值得强调细节,而不是说“请阅读您说过已经阅读过的页面”,这真的是一个ASP.NET web应用程序吗?然后您会遇到安全问题,因为您的应用程序上下文可能不允许运行内核函数。是的,它是一个正在工作/运行的Asp.Net web应用程序。它已经存在,我忘了在我的问题中写入。这并不能解决issueboth方法已经在类中的问题,因为我修改了我的问题OK,我发现要释放此错误,需要使用[assembly:AllowPartiallyTrustedCallers];没有它,您就不会在安全调用方面出错。如果需要[assembly:AllowPartiallyTrustedCallers],则需要两个SecurityAttribute。我用它更新了答案。它已经在那里了,我忘了在我的问题里写。这并不能解决issueboth方法已经在类中的问题,因为我修改了我的问题OK,我发现要释放此错误,需要使用[assembly:AllowPartiallyTrustedCallers];没有它,您就不会在安全调用方面出错。如果需要[assembly:AllowPartiallyTrustedCallers],则需要两个SecurityAttribute。我用这个更新了答案。
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);
}