在应用程序中,我们可以将报告输出为csv文件并加载它,类似于以下代码:
Process.Start("C:\MyReport.csv") ' Not real path
运行代码分析时会产生以下错误:
CA2122不要将具有链接要求的方法'Form.Function(Definition)'调用间接地暴露给具有LinkDemand的'Process.Start(String)'。通过进行此调用,'Process.Start(String)'间接暴露给用户代码
我已经看到用SecurityTransparentAttribute
标记程序集的某个地方,这是否只是取消了消息?如果是这样,这不是我想要的。是否有另一种打开文件的方法可以绕过这个消息而不会抑制它?如果我现在不能在其他任何地方使用Excel,我最好还是避免使用Excel自动化。
想法?
答案 0 :(得分:7)
我今天偶然发现了同样的问题,并认为以下答案对其他人如此有用是有用的。
基本上,我的代码是在explorer中打开一个给定的目录路径,如下所示
public static void OpenDirectoryPath(string directoryPath)
{
if (Directory.Exists(directoryPath))
{
Process.Start(directoryPath);
}
}
以上代码产生了以下错误
CA2122:Microsoft.Security:'Helper.OpenDirectoryPath(string)'调用具有LinkDemand的'Process.Start(string)'。通过进行此调用,'Process.Start(string)'间接暴露给用户代码。查看以下可能暴露出绕过安全保护的方法的调用堆栈:
要问的问题是,你真的希望这种方法公开吗?就我而言,答案是“不”。将方法更改为内部解决了问题。
internal static void OpenDirectoryPath(string directoryPath)
{
if (Directory.Exists(directoryPath))
{
Process.Start(directoryPath);
}
}
答案 1 :(得分:3)
Process.Start()有[PermissionSet(SecurityAction.LinkDemand,Name =“FullTrust”,Unrestricted = false)]属性。
层次结构中的所有函数都必须设置此属性。
实施例
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method1()
{
Process.Start(...);
}
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method2()
{
Method1();
}
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method3()
{
Method2();
}
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method4()
{
Method3();
}
...
...
这解决了这个问题。我没有测试安全违规情况,但我希望这必须解决问题。
答案 2 :(得分:1)
您可能根本不关心它(在本地抑制消息)或全局抑制。这取决于您的安全策略/请求。
意味着: Process.Start已应用一些安全属性,但它已指定只应为其及其调用者(SecurityAction.LinkDemand)执行检查。这意味着如果您在公共方法中调用它,则使用您的方法的代码将跳过此安全检查。您可以信任您的代码来调用Process.Start,但他们的代码不是,但如果他们调用您的方法,他们将获得该权限。
如果您需要解决此问题,可以将相同的安全属性应用于您的代码,这将要求您的调用者具有该权限(SecurityAction.LinkDemand不会遍历整个堆栈,因此它更快)。