使用 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的主要内容,如果未能解决你的问题,请参考以下文章
csharpcodeprovider:不能使用 Process.Start()