使用 Process.Start 修复 CA2122

Posted

技术标签:

【中文标题】使用 Process.Start 修复 CA2122【英文标题】:Fixing CA2122 with Process.Start 【发布时间】:2012-03-15 17:16:40 【问题描述】:

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

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

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

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

我在某处看到用SecurityTransparentAttribute 标记程序集,这只是抑制消息吗?如果是这样,这不是我想要的。是否有另一种打开文件的方法可以绕过此消息而不抑制它?如果可以的话,我最好避免使用 Excel 自动化,因为目前其他任何地方都没有使用 Excel。

想法?

【问题讨论】:

是否可以使用 SupressMessage 属性? @Silvermind,禁止显示消息并不能解决根本问题... 对不起。我误读了这个问题。 @silvermind 更新了问题,希望能更清楚:) Linkdemand warning in c#的可能重复 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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


...
...

这解决了这个问题。我没有测试安全违规场景,但我希望这一定能解决问题。

【讨论】:

感谢您的回答,但我已经解决了这个问题,不再参与该项目。无论哪种情况,我都赞成你的努力:)【参考方案3】:

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

什么意思是: Process.Start 应用了一些安全属性,但它已指定应仅对其及其调用者 (SecurityAction.LinkDemand) 进行检查。这意味着如果您在公共方法中调用它,则使用您的方法的代码将跳过此安全检查。您的代码可能会被信任调用 Process.Start 但他们的代码不是,但如果他们调用您的方法,他们将获得该特权。

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

【讨论】:

以上是关于使用 Process.Start 修复 CA2122的主要内容,如果未能解决你的问题,请参考以下文章

Process.Start 功能

csharpcodeprovider:不能使用 Process.Start()

使用 process.start 后如何退出主程序?

使用 Process.Start() 通过快捷方式运行应用程序

process.start() 参数

Process.Start 打开资源管理器