繁体   English   中英

CA2122 DoNotIndirectExposeMethodsWithLinkDemands

[英]CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands

我在此函数上收到错误CA2122 DoNotIndirectExposeMethodsWithLinkDemands:

  internal static string GetProcessID()
        {

                return Process.GetCurrentProcess().Id.ToString(CultureInfo.CurrentCulture);

        }

如何解决?

我收到错误CA2122

这不是错误,只是警告。 您使用的代码分析工具会检查很多晦涩的极端情况,这种情况是C#编译器不会抱怨的,但可能不是一个好习惯。 以及程序员通常不知道的那种。 它最初设计为内部工具,供从事框架代码工作的Microsoft程序员使用。 他们必须遵循的规则非常严苛,因为它们无法预测将如何使用其代码。

... WithLinkDemands

链接需求是代码访问安全性(CAS)详细信息。 它确保代码具有执行的足够权限。 链接需求非常便宜,它们仅被检查一次,在即时编译代码时发生。 警告仅指“ on-once”子句,具有足够权限的代码在技术上有可能首先执行,从而允许方法被伪装,但随后由不可信代码使用,从而绕过检查。 该工具仅假定可能由于该方法是公共方法而发生这种情况,因此并不知道这种情况实际上是在您的程序中发生的。

返回Process.GetCurrentProcess()...

具有链接需求的是Process类。 您可以从MSDN文章中了解哪些要求。 它验证了调用代码是否完全信任地运行,没有在诸如SQL Server这样的不受限制的非托管主机中运行,并且派生类也满足了这些要求。 Process类有点冒险,不受信任的代码可以通过启动一个过程来绕过CAS检查或对它运行的过程了解太多并修改其配置,从而做恶作剧。

如何解决?

不止一种可能的方法。 大致顺序为:

  1. 总是有很大的可能性,这个警告并不适用于您的程序。 换句话说,它永远不会执行您不信任的代码。 您的程序必须支持由您不认识的程序员编写的插件,但仍然可以访问该计算机以告诉您的程序加载其插件。 不是很常见。 正确的方法是配置工具以匹配程序的行为,然后禁用该规则。

  2. 使用此方法评估不受信任的代码的风险。 对于该特定方法,这应该是一个较低的值,因为公开进程ID不会泄露任何主要机密。 它只是一个数字,在使用Process.GetProcessById()的代码使用它之前,它不会成为危险数字。 因此,您可以考虑取消警告,将[SuppressMessage]属性应用于该方法。 这是一个常见的结果,框架源代码有很多。

  3. 遵循工具的建议,并将CAS属性也应用于此方法。 只需从MSDN文章中看到的链接中复制粘贴即可。 这消除了“仅一次”漏洞,不受信任的代码现在将无法启动并且无法执行。

暂无
暂无

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

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