簡體   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