gpt4 book ai didi

c# - CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands

转载 作者:行者123 更新时间:2023-12-03 08:20:40 26 4
gpt4 key购买 nike

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

  internal static string GetProcessID()
{

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

}

如何解决?

最佳答案

I got error CA2122



这不是错误,只是警告。您使用的代码分析工具会检查许多晦涩的极端情况,C# 编译器不会提示这种情况,但可能是一种不好的做法。以及程序员通常不知道的那种。它最初被设计为微软程序员处理框架代码的内部工具。他们必须遵守的规则非常严格,因为他们无法预测他们的代码将被如何使用。

...WithLinkDemands



链接需求是代码访问安全 (CAS) 详细信息。它确保代码具有足够的执行权限。链接需求非常便宜,它们只检查一次,发生在代码即时编译时。 “only-once”子句是警告所说的,技术上可以让有足够权限的代码先执行,从而允许方法被jited,但稍后被不可信的代码使用,从而绕过检查.该工具只是假设这可能发生,因为该方法是公共(public)的,它不知道这实际上发生在您的程序中。

return Process.GetCurrentProcess()...



有链接需求的是 Process 类。您可以从 MSDN article 中得知这要求它。它验证调用代码是否在完全信任的情况下运行,它不会在像 SQL Server 这样的限制性非托管主机中运行,并且派生类也满足这些要求。 Process 类有点冒险,不受信任的代码可能会通过启动一个进程来绕过 CAS 检查或了解太多关于它运行的进程并修改其配置来做淘气的事情。

How to fix it?



不止一种可能的方法。大致顺序:
  • 此警告不适用于您的程序的可能性总是很高。换句话说,它不存在执行您不信任的代码的风险。你的程序必须支持插件,这些插件是由你不了解但仍然可以访问机器告诉你的程序加载他们的插件的程序员编写的。不是很常见。正确的方法是配置工具以匹配您的程序的行为,您将禁用该规则。
  • 使用此方法评估不受信任代码的风险。对于这种特定方法,这应该是一个较低的值,暴露进程 ID 不会泄露任何重大 secret 。它只是一个数字,除非它被使用 Process.GetProcessById() 的代码使用,否则它不会成为一个有风险的数字。所以你会考虑抑制警告,应用 [SuppressMessage] attribute到方法。这是一个常见的结果,框架源代码有很多很多。
  • 遵循工具的建议并将 CAS 属性也应用于此方法。只需从您在 MSDN 文章中看到的链接需求中复制粘贴即可。这关闭了“仅一次”的漏洞,不受信任的代码现在将无法 jit 并且无法执行。
  • 关于c# - CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032271/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com