CA2109: 표시되는 이벤트 처리기를 검토하십시오.

속성 값
규칙 ID CA2109
제목 표시되는 이벤트 처리기를 검토하세요.
범주 보안
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

발견된 것은 public 또는 protected 이벤트 처리 메서드였습니다.

주의

이 규칙은 더 이상 사용되지 않습니다. 마지막으로 Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet 패키지 및 .NET 7 SDK와 함께 제공되었습니다.

.NET Framework 4.5 이후 분석기에서 경고한 위협(권한 있는 이벤트 처리기를 권한 있는 이벤트 호출자에 연결하는 신뢰할 수 없는 중간자)이 없기 때문에 규칙이 제거되었습니다.

규칙 설명

외부에 표시되는 이벤트 처리 메서드는 검토가 필요한 보안 문제를 표시합니다.

이벤트 처리 메서드는 꼭 필요한 경우에만 노출합니다. 노출된 메서드를 호출하는 이벤트 처리기인 대리자 형식은 처리기 및 이벤트 시그니처가 일치하는 경우 이벤트에 추가할 수 있습니다. 이벤트는 코드에 의해 발생할 수 있으며 단추 클릭과 같은 사용자 동작에 대한 응답으로 완전히 신뢰할 수 있는 시스템 코드에 의해 발생하는 경우가 많습니다. 이벤트 처리 메서드에 보안 검사를 추가해도 코드에서 메서드를 호출하는 이벤트 처리기를 등록하는 것을 방지할 수 없습니다.

요청은 이벤트 처리기에서 호출되는 메서드를 안정적으로 보호할 수 없습니다. 보안 요청은 호출 스택에서 호출자를 검사하여 신뢰할 수 없는 호출자로부터 코드를 보호하는 데 도움이 됩니다. 이벤트에 이벤트 처리기를 추가하는 코드는 이벤트 처리기의 메서드가 실행될 때 호출 스택에 반드시 있어야 하는 것은 아닙니다. 따라서 이벤트 처리기 메서드가 호출될 때 호출 스택에는 완전히 신뢰할 수 있는 호출자만 있을 수 있습니다. 이로 인해 이벤트 처리기 메서드에 의한 요청이 성공합니다. 또한 메서드가 호출될 때 요청된 사용 권한을 어설션할 수 있습니다. 이러한 이유로 이 규칙의 위반 문제를 해결하지 않는 위험은 이벤트 처리 메서드를 검토한 후에만 평가할 수 있습니다. 코드를 검토할 때 다음 문제를 고려하세요.

  • 이벤트 처리기가 사용 권한 어설션이나 비관리 코드 사용 권한 중지와 같이 위험하거나 악용 가능성이 있는 작업을 수행하나요?

  • 스택에서 완전히 신뢰할 수 있는 호출자만 사용하여 언제든지 실행할 수 있기 때문에 코드에서 발생할 수 있는 보안 위협은 무엇인가요?

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 메서드를 검토하고 다음을 평가하세요.

  • 이벤트 처리 메서드를 public이 아닌 메서드로 만들 수 있나요?

  • 이벤트 처리기에서 모든 위험한 기능을 이동할 수 있나요?

  • 보안 요청이 적용되는 경우 다른 방법으로 달성할 수 있나요?

경고를 표시하지 않는 경우

코드가 보안 위협을 초래하지 않는다고 확신할 수 있도록 신중한 보안 검토를 거친 후에만 이 규칙의 경고를 억제하십시오.

경고 표시 안 함

단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.

#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.");
    }
}

참고하기