28
NET安全编程无责任指南:DoNotIndirectlyExposeMethodsWithLinkDemands
今天利用FxCop对工作中代码进行分析,代码片段如下:
private static FileStream CreateFileStream(string fName, string stream, FileAccess access)
{
SafeFileHandle handleValue = NativeMethods.CreateFile(string.Format(”{0}:{1}”, fName, stream),
Convert(desiredAccess),
access== FileAccess.Read ? NativeMethods.FILE_SHARE_READ : 0,
IntPtr.Zero,
NativeMethods.OPEN_ALWAYS,
0,
IntPtr.Zero);
if (handleValue.IsInvalid)
{
return null;
}
return new FileStream(handleValue, desiredAccess);
}
分析结果是[Warning]Do not indirectly expose methods with link demands。具体来看因为使用了Microsoft.Win32.SafeHandles.SafeFileHandle的IsInvalid方法。这个方法使用了LinkDemand签名因为它是一个非托管的方法。对于调用使用了LinkDemand声明的方法。对于此类方法只有完全受新人的调用方才能使用他们,除非程序集通过应用AllowPartiallyTruestedCaller属性显式的决定参与使用。这样避免了非受信任的代码通过反射等方式来调用此类方法。
因此要解决上述问题,需要对函数CreateFileStream进行声明
我使用 [System.Security.Permissions.PermissionSetAttribute
(System.Security.Permissions.SecurityAction.Demand, Name=”FullTrust”)]
来表明函数是安全的。具体的描述可以参考如下链接:
http://www.host01.com/article/Net/c/056609494910420_3.htm


