繁体   English   中英

使用Process.Start修复CA2122

[英]Fixing CA2122 with Process.Start

在应用程序中,我们可以将报告输出为csv文件并加载它类似于以下代码:

Process.Start("C:\MyReport.csv") ' Not real path 

运行代码分析时,会产生以下错误:

CA2122不要将具有链接需求“Form.Function(Definition)”调用的方法间接暴露给具有LinkDemand的“Process.Start(String)”。 通过进行此调用,'Process.Start(String)'间接暴露给用户代码

我已经看到用SecurityTransparentAttribute标记程序集的地方,这是否只是抑制了消息? 如果是这样,这不是我想要的。 是否有另一种打开文件的方法可以绕过这个消息而不会抑制它? 如果我现在不能在其他任何地方使用Excel,我最好还是避免使用Excel自动化。

想法?

我今天偶然发现了同样的问题,并认为以下答案对其他人如此有用是如此。

所以基本上,我的代码是在资源管理器中打开一个给定的目录路径,如下所示

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);
    }
}

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();
}

...
...

这解决了这个问题。 我没有测试安全违规情况,但我希望这必须解决问题。

您根本不关心它(在本地抑制消息)或全局抑制。 这取决于您的安全策略/请求。

意味着:Process.Start应用了一些安全属性,但它已指定只应为它和它的调用者(SecurityAction.LinkDemand)进行检查。 这意味着如果您在公共方法中调用它,则使用您的方法的代码将跳过此安全检查。 您可以信任您的代码来调用Process.Start,但他们的代码不是,但如果他们调用您的方法,他们将获得该权限。

如果您需要解决此问题,您可以将相同的安全属性应用于您的代码 ,这将要求您的调用者具有该权限(SecurityAction.LinkDemand不会遍历整个堆栈,因此它更快)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM