共用方式為


CA2109:必須檢閱可見的事件處理常式

屬性
規則識別碼 CA2109
職稱 必須檢閱可見的事件處理常式
類別 安全性
修正程式是中斷或非中斷 中斷
預設在 .NET 9 中啟用 No

原因

偵測到公用或保護的事件處理方法。

注意

此規則已遭取代。 其最後隨附於 Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet 套件和 .NET 7 SDK。

已移除規則,因為分析器警告的威脅(將特殊許可權事件處理程序連結至特殊許可權事件叫用者之不受信任的媒介)自 .NET Framework 4.5 以來一直不存在。

檔案描述

外部可見的事件處理方法會顯示需要檢閱的安全性問題。

除非絕對必要,否則請勿公開事件處理方法。 只要處理程式和事件簽章相符,就可以將叫用公開方法的事件處理程式加入至任何事件。 事件可能會由任何程式代碼引發,而且經常由高度信任的系統程式代碼引發,以回應用戶動作,例如按兩下按鈕。 將安全性檢查新增至事件處理方法,並不會防止程式代碼註冊叫用 方法的事件處理程式。

需求無法可靠地保護事件處理程式叫用的方法。 安全性需求可藉由檢查呼叫堆疊上的呼叫端,協助保護程式代碼免於不受信任的呼叫端。 當事件處理程式的方法執行時,將事件處理程式加入事件的程式代碼不一定存在於呼叫堆疊上。 因此,呼叫堆疊在叫用事件處理程式方法時,可能只有高度信任的呼叫端。 這會導致事件處理程式方法的要求成功。 此外,叫用 方法時,可能會判斷提示要求的許可權。 基於這些原因,在檢閱事件處理方法之後,才能評估未修正此規則違規的風險。 當您檢閱程式代碼時,請考慮下列問題:

  • 您的事件處理程式是否執行任何危險或可利用的作業,例如判斷提示許可權或隱藏 Unmanaged 程式代碼許可權?

  • 您程式代碼的安全性威脅為何,因為它可以隨時在堆疊上只執行高度信任的呼叫端?

如何修正違規

若要修正此規則的違規問題,請檢閱 方法並評估下列專案:

  • 您是否可以將事件處理方法設為非公用?

  • 您可以將所有危險的功能移出事件處理程式嗎?

  • 如果實行安全性需求,是否可以以某種其他方式完成這項作業?

隱藏警告的時機

只有在仔細的安全性檢閱之後,才隱藏此規則的警告,以確保您的程式代碼不會造成安全性威脅。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

若要停用檔案、資料夾或項目的規則,請在組態檔none

[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

範例

下列程式代碼顯示可由惡意代碼誤用的事件處理方法。

public class HandleEvents
{
    // Due to the access level and signature, a malicious caller could 
    // add this method to system-triggered events where all code in the call
    // stack has the demanded permission.

    // Also, the demand might be canceled by an asserted permission.

    [SecurityPermissionAttribute(SecurityAction.Demand, UnmanagedCode = true)]

    // Violates rule: ReviewVisibleEventHandlers.
    public static void SomeActionHappened(Object sender, EventArgs e)
    {
        Console.WriteLine("Do something dangerous from unmanaged code.");
    }
}

另請參閱