Microsoft 최소 권장 규칙 코드 분석 규칙 집합

Microsoft 최소 권장 규칙이라는 규칙 집합을 사용하면 잠재적 보안 허점, 응용 프로그램 충돌, 기타 중요한 논리 및 디자인 오류를 비롯하여 코드의 가장 중요한 문제에 초점을 맞출 수 있습니다. 프로젝트에 대해 만드는 모든 사용자 지정 규칙 집합에 이 규칙 집합을 포함해야 합니다.

규칙

설명

CA1001: 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.

클래스가 System.IDisposable 형식인 인스턴스 필드를 선언하고 구현하지만 IDisposable은 구현하지 않습니다. IDisposable 필드를 선언하는 클래스는 관리되지 않는 리소스를 간접적으로 소유하며 IDisposable 인터페이스를 구현해야 합니다.

CA1009: 이벤트 처리기를 제대로 선언하십시오.

이벤트 처리기 메서드는 두 개의 매개 변수를 사용합니다. 첫 번째 매개 변수는 System.Object 형식이고 이름은 "sender"입니다. 이 매개 변수는 이벤트를 발생시킨 개체입니다. 두 번째 매개 변수는 System.EventArgs 형식이고 이름은 "e"입니다. 이 매개 변수는 이벤트와 관련된 데이터입니다. 이벤트 처리기 메서드는 값을 반환하지 않아야 하며, C# 프로그래밍 언어에서 이는 반환 형식 void로 표시됩니다.

CA1016: AssemblyVersionAttribute로 어셈블리 표시

.NET Framework에서는 버전 번호를 사용하여 어셈블리를 고유하게 식별하며 강력한 이름의 어셈블리에 있는 형식에 바인딩합니다. 버전 번호는 버전 및 게시자 정책과 함께 사용됩니다. 기본적으로 응용 프로그램은 해당 응용 프로그램이 빌드될 때 사용된 어셈블리 버전으로만 실행됩니다.

CA1033: 인터페이스 메서드는 자식 형식에서 호출할 수 있어야 합니다.

외부에서 볼 수 있는 unsealed 형식이 public 인터페이스의 명시적 메서드 구현을 제공하면서 외부에서 볼 수 있는 같은 이름의 대체 메서드를 제공하지 않습니다.

CA1049: 네이티브 리소스가 있는 형식은 삭제 가능해야 합니다.

관리되지 않는 리소스를 할당하는 형식은 IDisposable을 구현하여 호출자가 필요할 때 해당 리소스를 해제할 수 있도록 하고 리소스를 차지하고 있는 개체의 수명을 줄여야 합니다.

CA1060: P/Invoke를 NativeMethods 클래스로 이동

System.Runtime.InteropServices.DllImportAttribute 특성으로 표시된 메서드나 Visual Basic에서 Declare 키워드를 사용하여 정의된 메서드 같은 플랫폼 호출 메서드에서는 비관리 코드에 액세스합니다. 이러한 메서드는 NativeMethods, SafeNativeMethods 또는 UnsafeNativeMethods 클래스에 속해야 합니다.

CA1061: 기본 클래스 메서드를 숨기지 마십시오.

파생된 메서드의 매개 변수 시그니처가 기본 메서드의 매개 변수 시그니처에 있는 해당 형식보다 더 약하게 파생된 형식이라는 점만 다른 경우 기본 형식의 메서드는 파생된 형식에 있는 동일한 이름의 메서드에 의해 숨겨집니다.

CA1063: IDisposable을 올바르게 구현하십시오.

모든 IDisposable 형식은 Dispose 패턴을 올바르게 구현해야 합니다.

CA1065: 예기치 않은 위치에서 예외를 발생시키지 마십시오.

예외를 throw하지 않아야 하는 메서드가 예외를 throw했습니다.

CA1301: 중복 액셀러레이터 키를 사용하지 마십시오.

액셀러레이터 키라고도 하는 선택키를 사용하면 Alt 키를 사용하여 키보드로 컨트롤에 액세스할 수 있습니다. 여러 컨트롤에 중복되는 선택키가 있으면 선택키의 동작이 제대로 정의되지 않은 경우입니다.

CA1400: P/Invoke 진입점이 있어야 합니다.

public 또는 protected 메서드는 System.Runtime.InteropServices.DllImportAttribute 특성으로 표시됩니다. 관리되지 않는 라이브러리를 찾을 수 없거나 해당 메서드와 라이브러리의 함수가 일치하지 않습니다.

CA1401: P/Invoke는 노출되지 않아야 합니다.

public 형식의 public 또는 protected 메서드는 System.Runtime.InteropServices.DllImportAttribute 특성을 가지며 또한 Visual Basic에서 Declare 키워드로 구현됩니다. 이러한 메서드는 노출되지 않아야 합니다.

CA1403: 자동 레이아웃 형식은 COM 노출이면 안 됩니다.

COM 노출 값 형식은 System.Runtime.InteropServices.StructLayoutAttribute 특성이 LayoutKind.Auto로 설정됨으로써 표시됩니다. 이들 형식의 레이아웃은 .NET Framework 버전 간에 변경될 수 있으므로 특정 레이아웃이 필요한 COM 클라이언트에서는 문제가 발생할 수 있습니다.

CA1404: P/Invoke 다음에 바로 GetLastError를 호출하십시오.

Marshal.GetLastWin32Error 메서드 또는 이와 동일한 기능의 Win32 GetLastError 함수를 호출하였으며 직전의 호출이 플랫폼 호출 메서드에 대한 호출이 아닙니다.

CA1405: COM 노출 형식의 기본 형식은 COM 노출이어야 합니다.

COM 노출 형식이 COM에 노출되지 않는 형식에서 파생됩니다.

CA1410: COM 등록 메서드는 일치해야 합니다.

형식이 System.Runtime.InteropServices.ComRegisterFunctionAttribute 특성으로 표시된 메서드를 선언하지만 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 특성으로 표시된 메서드는 선언하지 않거나 그 반대의 경우입니다.

CA1415: P/Invoke를 올바르게 선언하십시오.

이 규칙에서는 OVERLAPPED 구조체 매개 변수에 대한 포인터가 있는 Win32 함수를 대상으로 하는 플랫폼 호출 메서드 선언을 찾는데 관리되는 해당 매개 변수가 System.Threading.NativeOverlapped 구조체에 대한 포인터가 아닙니다.

CA1900: 값 형식 필드는 이식 가능해야 합니다.

이 규칙에서는 명시적 레이아웃으로 선언된 구조체가 64비트 운영 체제에서 비관리 코드로 마샬링될 때 올바르게 맞춰지는지 검사합니다.

CA1901: P/Invoke 선언은 이식 가능해야 합니다.

이 규칙은 P/Invoke의 반환 값과 각 매개 변수의 크기를 계산하여 32비트 및 64비트 운영 체제에서 비관리 코드로 마샬링될 때 그 크기가 올바른지 확인합니다.

CA2000: 범위를 벗어나기 전에 개체를 삭제하십시오.

개체의 종료자가 실행되지 못하도록 하는 예외 이벤트가 발생할 수 있기 때문에 개체에 대한 모든 참조가 범위를 벗어나기 전에 개체를 명시적으로 삭제해야 합니다.

CA2002: 약한 ID를 가진 개체를 잠그지 마십시오.

응용 프로그램 도메인 경계를 가로질러 직접 액세스할 수 있는 개체를 약한 ID를 가진 개체라고 합니다. 약한 ID를 가진 개체에 대해 잠금을 가져오려고 시도하는 스레드는 같은 개체에 대해 잠금을 가진 다른 응용 프로그램 도메인의 스레드에 의해 차단될 수 있습니다.

CA2100: 보안상 취약한 부분이 있는지 SQL 쿼리를 검토하십시오.

메서드가 메서드에 대한 문자열 인수로부터 만들어진 문자열을 사용하여 System.Data.IDbCommand.CommandText 속성을 설정합니다. 이 규칙에서는 문자열 인수에 사용자 입력이 포함된 것으로 가정합니다. 사용자 입력으로부터 만들어진 SQL 명령 문자열은 SQL 삽입 공격에 취약합니다.

CA2101: P/Invoke 문자열 인수에 대해 마샬링을 지정하십시오.

플랫폼 호출 멤버가 부분 신뢰 호출자를 허용하고, 문자열 매개 변수를 사용하고, 문자열을 명시적으로 마샬링하지 않습니다. 이렇게 하면 보안상 위험할 수 있습니다.

CA2108: 값 형식에서 선언적 보안을 검토하십시오.

public 또는 protected 값 형식이 데이터 액세스 또는 링크 요청에 의해 보안됩니다.

CA2111: 포인터는 노출되면 안 됩니다.

포인터가 전용, 내부 또는 읽기 전용이 아닙니다. 악의적인 코드에서는 해당 포인터 값을 변경하여 메모리 내 임의의 위치에 액세스할 수 있게 되거나 응용 프로그램 또는 시스템 오류를 발생시킬 수 있습니다.

CA2112: 보안 형식은 필드를 노출하면 안 됩니다.

public 또는 protected 형식이 public 필드를 포함하고 링크 요청에 의해 보안됩니다. 코드에 링크 요청으로 보안된 형식의 인스턴스에 대한 액세스 권한이 있으면 코드에서 링크 요청을 만족하지 않아도 해당 형식의 필드에 액세스할 수 있습니다.

CA2114: 메서드 보안은 형식의 상위 집합이어야 합니다.

메서드에는 같은 동작에 대해 메서드 수준과 형식 수준의 선언적 보안이 모두 있으면 안 됩니다.

CA2116: APTCA 메서드는 APTCA 메서드만 호출해야 합니다.

완전히 신뢰할 수 있는 어셈블리에 APTCA(AllowPartiallyTrustedCallers) 특성이 있고 이 어셈블리가 부분적으로 신뢰할 수 있는 호출자를 허용하지 않는 다른 어셈블리의 코드를 실행하면 보안상 위험할 수 있습니다.

CA2117: APTCA 형식은 APTCA 기본 형식만 확장해야 합니다.

완전히 신뢰할 수 있는 어셈블리에 APTCA(AllowPartiallyTrustedCallers) 특성이 있고 이 어셈블리의 형식이 부분적으로 신뢰할 수 있는 호출자를 허용하지 않는 형식에서 상속되면 보안상 위험할 수 있습니다.

CA2122: 링크 요청이 있는 메서드를 간접적으로 노출하지 마십시오.

public 또는 protected 멤버에 링크 요청이 있으며 해당 멤버가 보안 검사를 수행하지 않는 멤버에 의해 호출됩니다. 링크 요청은 직접 실행 호출자의 권한만 검사합니다.

CA2123: 재정의 링크 요청은 기본 형식의 링크 요청과 같아야 합니다.

이 규칙에서는 메서드를 다른 형식의 인터페이스이거나 가상 메서드인 기본 메서드에 일치시킨 다음 각각에 대해 링크 요청을 비교합니다. 이 규칙이 위반되면 악의적인 호출자가 보안되지 않은 메서드를 호출함으로써 링크 요청을 우회할 수 있습니다.

CA2124: 취약한 finally 절을 외부 try에 래핑하십시오.

public 또는 protected 메서드에 try/finally 블록이 들어 있습니다. finally 블록이 보안 상태를 다시 설정하는 것으로 나타나며 finally 블록에 포함되어 있지 않습니다.

CA2126: 형식 링크 요청에는 상속 요청이 필요합니다.

public unsealed 형식이 링크 요청으로 보호되며 재정의 가능한 메서드를 포함합니다. 형식이나 메서드는 모두 상속 요청으로 보호됩니다.

CA2131: 보안에 중요한 형식은 형식 등가에 참여할 수 없습니다.

형식이 형식 동등에 참여하는데, 해당 형식 자체 또는 해당 형식의 멤버나 필드가 SecurityCriticalAttribute 특성을 사용하여 표시되어 있습니다. 이 규칙은 중요한 형식 또는 중요한 메서드나 필드를 포함하는 형식이 형식 동등에 참여하는 경우에 적용됩니다. CLR에서 이러한 형식이 검색되면 런타임에 해당 형식이 로드되지 않고 TypeLoadException이 throw됩니다. 일반적으로 이 규칙은 사용자가 tlbimp와 컴파일러를 이용하여 형식 동등을 수행하는 대신 수동으로 형식 동등을 구현하는 경우에만 적용됩니다.

CA2132: 기본 생성자는 최소한 기본 형식 기본 생성자만큼 중요해야 합니다.

SecurityCriticalAttribute가 있는 형식 및 멤버는 Silverlight 응용 프로그램 코드에서 사용할 수 없습니다. 보안에 중요한 형식 및 멤버는 .NET Framework for Silverlight 클래스 라이브러리의 신뢰할 수 있는 코드에서만 사용할 수 있습니다. 파생 클래스의 public 또는 protected 구성 요소는 투명성이 기본 클래스보다 높거나 같아야 하기 때문에 응용 프로그램의 클래스는 SecurityCritical로 표시된 클래스에서 파생될 수 없습니다.

CA2133: 대리인은 투명도가 일관된 메서드에 바인딩해야 합니다.

이 경고는 SecurityCriticalAttribute를 사용하여 표시된 대리자를 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드에 바인딩하는 메서드에서 발생합니다. 또한 투명하거나 안전에 중요한 대리자를 중요한 메서드에 바인딩하는 메서드에서도 이 경고가 발생합니다.

CA2134: 메서드는 기본 메서드를 재정의할 때 일관성 있는 방식을 유지해야 합니다.

이 규칙은 SecurityCriticalAttribute를 사용하여 표시된 메서드가 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드를 재정의할 때 적용됩니다. 또한 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드가 SecurityCriticalAttribute를 사용하여 표시된 메서드를 재정의할 때도 이 규칙이 적용됩니다. 이 규칙은 가상 메서드를 재정의하거나 인터페이스를 구현할 때 적용됩니다.

CA2137: 투명한 메서드는 안정형 IL만 포함해야 합니다.

메서드가 확인할 수 없는 코드를 포함하거나 형식을 참조로 반환합니다. 이 규칙은 보안 투명 코드에서 확인할 수 없는 MSIL(Microsoft Intermediate Language)을 실행하려고 할 때 적용됩니다. 그러나 이 규칙은 완전한 IL 검증 도구를 포함하지 않으며 대신 휴리스틱을 사용하여 MSIL 확인 시 대부분의 위반을 catch합니다.

CA2138: 투명한 메서드는 SuppressUnmanagedCodeSecurity 특성을 가진 메서드를 호출해서는 안 됩니다.

보안 투명 메서드가 SuppressUnmanagedCodeSecurityAttribute 특성을 사용하여 표시된 메서드를 호출합니다.

CA2141: 투명한 메서드는 LinkDemands를 충족해서는 안 됩니다

보안 투명 메서드가 APTCA를 사용하여 표시되지 않은 어셈블리의 메서드를 호출하거나, 보안 투명 메서드가 형식 또는 메서드에 대한 LinkDemand를 충족합니다.

CA2146: 형식은 최소한 기본 형식 및 인터페이스만큼 중요해야 합니다.

보안 투명 메서드가 APTCA를 사용하여 표시되지 않은 어셈블리의 메서드를 호출하거나, 보안 투명 메서드가 형식 또는 메서드에 대한 LinkDemand를 충족합니다.

CA2147: 투명 메서드는 보안 어설션을 사용할 수 없습니다.

SecurityTransparentAttribute로 표시된 코드에는 어설션하는 데 필요한 권한이 부여되지 않습니다.

CA2149: 투명한 메서드는 네이티브 코드를 호출해서는 안 됩니다.

이 규칙은 P/Invoke 등을 통해 네이티브 코드를 직접 호출하는 모든 투명 메서드에 적용됩니다. 이 규칙이 위반되면 수준 2 투명성 모델에서 MethodAccessException이 발생하고 수준 1 투명성 모델에서 UnmanagedCode에 대한 완전 요청이 발생합니다.

CA2200: 스택 정보를 유지하도록 다시 throw하십시오.

예외가 다시 throw되며 예외가 throw 문에 명시적으로 지정되어 있습니다. throw 문에 예외를 지정하여 예외가 다시 throw되면 예외를 throw한 원래 메서드와 현재 메서드 간의 메서드 호출 목록이 손실됩니다.

CA2202: 개체를 여러 번 삭제하지 마십시오.

같은 개체에 대해 System.IDisposable.Dispose 또는 Dispose와 동일한 기능의 메서드(예를 들어, 일부 형식의 Close() 메서드)가 여러 번 호출될 수 있는 코드 경로가 메서드 구현에 포함되어 있습니다.

CA2207: 값 형식 정적 필드를 인라인으로 초기화하십시오.

값 형식에서 명시적인 정적 생성자를 선언합니다. 이 규칙 위반 문제를 해결하려면 모든 정적 데이터를 선언할 때 초기화하고 정적 생성자를 제거합니다.

CA2212: 서비스 구성 요소를 WebMethod를 사용하여 표시하지 마십시오.

System.EnterpriseServices.ServicedComponent로부터 상속하는 형식의 메서드가 System.Web.Services.WebMethodAttribute로 표시되어 있습니다. WebMethodAttribute 및 ServicedComponent 메서드에는 컨텍스트와 트랜잭션 흐름에 있어 충돌하는 동작 및 요구 사항이 있으므로 메서드의 동작이 일부 시나리오에서 잘못됩니다.

CA2213: 삭제 가능한 필드는 삭제해야 합니다.

System.IDisposable을 구현하는 형식이 마찬가지로 IDisposable을 구현하는 형식으로 된 필드를 선언합니다. 필드의 Dispose 메서드가 선언 형식의 Dispose 메서드에 의해 호출되지 않습니다.

CA2214: 재정의 가능한 메서드를 생성자에서 호출하지 마십시오.

생성자가 가상 메서드를 호출할 때 이 메서드를 호출하는 인스턴스의 생성자가 실행되지 않았을 가능성이 있습니다.

CA2216: 삭제 가능한 형식은 종료자를 선언해야 합니다.

System.IDisposable을 구현하고, 관리되지 않는 리소스의 사용을 암시하는 필드를 포함하는 형식이 Object.Finalize에 설명된 대로 종료자를 구현하지 않습니다.

CA2220: 종료자는 기본 클래스 종료자를 호출해야 합니다.

종료는 상속 계층을 통해 전파되어야 합니다. 이를 위해 형식은 자체 Finalize 메서드에서 기본 클래스의 Finalize 메서드를 호출해야 합니다.

CA2229: serialization 생성자를 구현하십시오.

이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다. 봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다.

CA2232: Windows Forms 진입점을 STAThread를 사용하여 표시하십시오.

STAThreadAttribute는 응용 프로그램에 대한 COM 스레딩 모델이 단일 스레드 아파트임을 나타냅니다. 이 특성은 Windows Forms을 사용하는 응용 프로그램의 진입점에 있어야 합니다. 이 특성을 생략하면 Windows 구성 요소가 제대로 작동하지 않을 수 있습니다.

CA2235: 모두 serialize할 수 없는 필드로 표시하십시오.

serialize할 수 없는 형식의 인스턴스 필드가 serialize할 수 있는 형식에 정의되었습니다.

CA2236: ISerializable 형식에서 기본 클래스 메서드를 호출하십시오.

이 규칙 위반 문제를 해결하려면 해당하는 파생된 형식의 메서드나 생성자에서 기본 형식 GetObjectData 메서드나 serialization 생성자를 호출합니다.

CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.

공용 언어 런타임에서 serializable로 인식되도록 하려면 형식이 ISerializable 인터페이스 구현을 통해 사용자 지정 serialization 루틴을 사용하는 경우에도 형식을 SerializableAttribute 특성으로 표시해야 합니다.

CA2238: serialization 메서드를 올바르게 구현하십시오.

serialization 이벤트를 처리하는 메서드에 올바른 시그너처, 반환 형식 또는 노출 수준이 없습니다.

CA2240: ISerializable을 올바르게 구현하십시오.

이 규칙 위반 문제를 해결하려면 GetObjectData 메서드를 표시하고 재정의 가능하도록 만든 다음 모든 인스턴스 필드가 serialization 프로세스에 포함되었는지 또는 NonSerializedAttribute 특성으로 명시적으로 표시되었는지 확인합니다.

CA2241: 형식 메서드에 올바른 인수를 제공하십시오.

System.String.Format에 전달된 format 인수에 각 개체 인수에 해당하는 형식 항목이 없거나 각 형식 항목에 해당하는 개체 인수가 없습니다.

CA2242: NaN에 대해 정확하게 테스트하십시오.

이 식은 Single.Nan 또는 Double.Nan에 대해 값을 테스트합니다. 값을 테스트하려면 Single.IsNan(Single) 또는 Double.IsNan(Double)을 사용합니다.