Microsoft 최소 권장 규칙 코드 분석 규칙 집합
Microsoft 최소 권장 규칙이라는 규칙 집합을 사용하면 잠재적 보안 허점, 응용 프로그램 충돌, 기타 중요한 논리 및 디자인 오류를 비롯하여 코드의 가장 중요한 문제에 초점을 맞출 수 있습니다. 프로젝트에 대해 만드는 모든 사용자 지정 규칙 집합에 이 규칙 집합을 포함해야 합니다.
규칙 |
설명 |
---|---|
클래스가 System.IDisposable 형식인 인스턴스 필드를 선언하고 구현하지만 IDisposable은 구현하지 않습니다. IDisposable 필드를 선언하는 클래스는 관리되지 않는 리소스를 간접적으로 소유하며 IDisposable 인터페이스를 구현해야 합니다. |
|
이벤트 처리기 메서드는 두 개의 매개 변수를 사용합니다. 첫 번째 매개 변수는 System.Object 형식이고 이름은 "sender"입니다. 이 매개 변수는 이벤트를 발생시킨 개체입니다. 두 번째 매개 변수는 System.EventArgs 형식이고 이름은 "e"입니다. 이 매개 변수는 이벤트와 관련된 데이터입니다. 이벤트 처리기 메서드는 값을 반환하지 않아야 하며, C# 프로그래밍 언어에서 이는 반환 형식 void로 표시됩니다. |
|
.NET Framework에서는 버전 번호를 사용하여 어셈블리를 고유하게 식별하며 강력한 이름의 어셈블리에 있는 형식에 바인딩합니다. 버전 번호는 버전 및 게시자 정책과 함께 사용됩니다. 기본적으로 응용 프로그램은 해당 응용 프로그램이 빌드될 때 사용된 어셈블리 버전으로만 실행됩니다. |
|
외부에서 볼 수 있는 unsealed 형식이 public 인터페이스의 명시적 메서드 구현을 제공하면서 외부에서 볼 수 있는 같은 이름의 대체 메서드를 제공하지 않습니다. |
|
관리되지 않는 리소스를 할당하는 형식은 IDisposable을 구현하여 호출자가 필요할 때 해당 리소스를 해제할 수 있도록 하고 리소스를 차지하고 있는 개체의 수명을 줄여야 합니다. |
|
System.Runtime.InteropServices.DllImportAttribute 특성으로 표시된 메서드나 Visual Basic에서 Declare 키워드를 사용하여 정의된 메서드 같은 플랫폼 호출 메서드에서는 비관리 코드에 액세스합니다. 이러한 메서드는 NativeMethods, SafeNativeMethods 또는 UnsafeNativeMethods 클래스에 속해야 합니다. |
|
파생된 메서드의 매개 변수 시그니처가 기본 메서드의 매개 변수 시그니처에 있는 해당 형식보다 더 약하게 파생된 형식이라는 점만 다른 경우 기본 형식의 메서드는 파생된 형식에 있는 동일한 이름의 메서드에 의해 숨겨집니다. |
|
모든 IDisposable 형식은 Dispose 패턴을 올바르게 구현해야 합니다. |
|
예외를 throw하지 않아야 하는 메서드가 예외를 throw했습니다. |
|
액셀러레이터 키라고도 하는 선택키를 사용하면 Alt 키를 사용하여 키보드로 컨트롤에 액세스할 수 있습니다. 여러 컨트롤에 중복되는 선택키가 있으면 선택키의 동작이 제대로 정의되지 않은 경우입니다. |
|
public 또는 protected 메서드는 System.Runtime.InteropServices.DllImportAttribute 특성으로 표시됩니다. 관리되지 않는 라이브러리를 찾을 수 없거나 해당 메서드와 라이브러리의 함수가 일치하지 않습니다. |
|
public 형식의 public 또는 protected 메서드는 System.Runtime.InteropServices.DllImportAttribute 특성을 가지며 또한 Visual Basic에서 Declare 키워드로 구현됩니다. 이러한 메서드는 노출되지 않아야 합니다. |
|
COM 노출 값 형식은 System.Runtime.InteropServices.StructLayoutAttribute 특성이 LayoutKind.Auto로 설정됨으로써 표시됩니다. 이들 형식의 레이아웃은 .NET Framework 버전 간에 변경될 수 있으므로 특정 레이아웃이 필요한 COM 클라이언트에서는 문제가 발생할 수 있습니다. |
|
Marshal.GetLastWin32Error 메서드 또는 이와 동일한 기능의 Win32 GetLastError 함수를 호출하였으며 직전의 호출이 플랫폼 호출 메서드에 대한 호출이 아닙니다. |
|
COM 노출 형식이 COM에 노출되지 않는 형식에서 파생됩니다. |
|
형식이 System.Runtime.InteropServices.ComRegisterFunctionAttribute 특성으로 표시된 메서드를 선언하지만 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 특성으로 표시된 메서드는 선언하지 않거나 그 반대의 경우입니다. |
|
이 규칙에서는 OVERLAPPED 구조체 매개 변수에 대한 포인터가 있는 Win32 함수를 대상으로 하는 플랫폼 호출 메서드 선언을 찾는데 관리되는 해당 매개 변수가 System.Threading.NativeOverlapped 구조체에 대한 포인터가 아닙니다. |
|
이 규칙에서는 명시적 레이아웃으로 선언된 구조체가 64비트 운영 체제에서 비관리 코드로 마샬링될 때 올바르게 맞춰지는지 검사합니다. |
|
이 규칙은 P/Invoke의 반환 값과 각 매개 변수의 크기를 계산하여 32비트 및 64비트 운영 체제에서 비관리 코드로 마샬링될 때 그 크기가 올바른지 확인합니다. |
|
개체의 종료자가 실행되지 못하도록 하는 예외 이벤트가 발생할 수 있기 때문에 개체에 대한 모든 참조가 범위를 벗어나기 전에 개체를 명시적으로 삭제해야 합니다. |
|
응용 프로그램 도메인 경계를 가로질러 직접 액세스할 수 있는 개체를 약한 ID를 가진 개체라고 합니다. 약한 ID를 가진 개체에 대해 잠금을 가져오려고 시도하는 스레드는 같은 개체에 대해 잠금을 가진 다른 응용 프로그램 도메인의 스레드에 의해 차단될 수 있습니다. |
|
메서드가 메서드에 대한 문자열 인수로부터 만들어진 문자열을 사용하여 System.Data.IDbCommand.CommandText 속성을 설정합니다. 이 규칙에서는 문자열 인수에 사용자 입력이 포함된 것으로 가정합니다. 사용자 입력으로부터 만들어진 SQL 명령 문자열은 SQL 삽입 공격에 취약합니다. |
|
플랫폼 호출 멤버가 부분 신뢰 호출자를 허용하고, 문자열 매개 변수를 사용하고, 문자열을 명시적으로 마샬링하지 않습니다. 이렇게 하면 보안상 위험할 수 있습니다. |
|
public 또는 protected 값 형식이 데이터 액세스 또는 링크 요청에 의해 보안됩니다. |
|
포인터가 전용, 내부 또는 읽기 전용이 아닙니다. 악의적인 코드에서는 해당 포인터 값을 변경하여 메모리 내 임의의 위치에 액세스할 수 있게 되거나 응용 프로그램 또는 시스템 오류를 발생시킬 수 있습니다. |
|
public 또는 protected 형식이 public 필드를 포함하고 링크 요청에 의해 보안됩니다. 코드에 링크 요청으로 보안된 형식의 인스턴스에 대한 액세스 권한이 있으면 코드에서 링크 요청을 만족하지 않아도 해당 형식의 필드에 액세스할 수 있습니다. |
|
메서드에는 같은 동작에 대해 메서드 수준과 형식 수준의 선언적 보안이 모두 있으면 안 됩니다. |
|
완전히 신뢰할 수 있는 어셈블리에 APTCA(AllowPartiallyTrustedCallers) 특성이 있고 이 어셈블리가 부분적으로 신뢰할 수 있는 호출자를 허용하지 않는 다른 어셈블리의 코드를 실행하면 보안상 위험할 수 있습니다. |
|
완전히 신뢰할 수 있는 어셈블리에 APTCA(AllowPartiallyTrustedCallers) 특성이 있고 이 어셈블리의 형식이 부분적으로 신뢰할 수 있는 호출자를 허용하지 않는 형식에서 상속되면 보안상 위험할 수 있습니다. |
|
public 또는 protected 멤버에 링크 요청이 있으며 해당 멤버가 보안 검사를 수행하지 않는 멤버에 의해 호출됩니다. 링크 요청은 직접 실행 호출자의 권한만 검사합니다. |
|
이 규칙에서는 메서드를 다른 형식의 인터페이스이거나 가상 메서드인 기본 메서드에 일치시킨 다음 각각에 대해 링크 요청을 비교합니다. 이 규칙이 위반되면 악의적인 호출자가 보안되지 않은 메서드를 호출함으로써 링크 요청을 우회할 수 있습니다. |
|
public 또는 protected 메서드에 try/finally 블록이 들어 있습니다. finally 블록이 보안 상태를 다시 설정하는 것으로 나타나며 finally 블록에 포함되어 있지 않습니다. |
|
public unsealed 형식이 링크 요청으로 보호되며 재정의 가능한 메서드를 포함합니다. 형식이나 메서드는 모두 상속 요청으로 보호됩니다. |
|
형식이 형식 동등에 참여하는데, 해당 형식 자체 또는 해당 형식의 멤버나 필드가 SecurityCriticalAttribute 특성을 사용하여 표시되어 있습니다. 이 규칙은 중요한 형식 또는 중요한 메서드나 필드를 포함하는 형식이 형식 동등에 참여하는 경우에 적용됩니다. CLR에서 이러한 형식이 검색되면 런타임에 해당 형식이 로드되지 않고 TypeLoadException이 throw됩니다. 일반적으로 이 규칙은 사용자가 tlbimp와 컴파일러를 이용하여 형식 동등을 수행하는 대신 수동으로 형식 동등을 구현하는 경우에만 적용됩니다. |
|
SecurityCriticalAttribute가 있는 형식 및 멤버는 Silverlight 응용 프로그램 코드에서 사용할 수 없습니다. 보안에 중요한 형식 및 멤버는 .NET Framework for Silverlight 클래스 라이브러리의 신뢰할 수 있는 코드에서만 사용할 수 있습니다. 파생 클래스의 public 또는 protected 구성 요소는 투명성이 기본 클래스보다 높거나 같아야 하기 때문에 응용 프로그램의 클래스는 SecurityCritical로 표시된 클래스에서 파생될 수 없습니다. |
|
이 경고는 SecurityCriticalAttribute를 사용하여 표시된 대리자를 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드에 바인딩하는 메서드에서 발생합니다. 또한 투명하거나 안전에 중요한 대리자를 중요한 메서드에 바인딩하는 메서드에서도 이 경고가 발생합니다. |
|
이 규칙은 SecurityCriticalAttribute를 사용하여 표시된 메서드가 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드를 재정의할 때 적용됩니다. 또한 SecuritySafeCriticalAttribute를 사용하여 표시되거나 투명한 메서드가 SecurityCriticalAttribute를 사용하여 표시된 메서드를 재정의할 때도 이 규칙이 적용됩니다. 이 규칙은 가상 메서드를 재정의하거나 인터페이스를 구현할 때 적용됩니다. |
|
메서드가 확인할 수 없는 코드를 포함하거나 형식을 참조로 반환합니다. 이 규칙은 보안 투명 코드에서 확인할 수 없는 MSIL(Microsoft Intermediate Language)을 실행하려고 할 때 적용됩니다. 그러나 이 규칙은 완전한 IL 검증 도구를 포함하지 않으며 대신 휴리스틱을 사용하여 MSIL 확인 시 대부분의 위반을 catch합니다. |
|
CA2138: 투명한 메서드는 SuppressUnmanagedCodeSecurity 특성을 가진 메서드를 호출해서는 안 됩니다. |
보안 투명 메서드가 SuppressUnmanagedCodeSecurityAttribute 특성을 사용하여 표시된 메서드를 호출합니다. |
보안 투명 메서드가 APTCA를 사용하여 표시되지 않은 어셈블리의 메서드를 호출하거나, 보안 투명 메서드가 형식 또는 메서드에 대한 LinkDemand를 충족합니다. |
|
보안 투명 메서드가 APTCA를 사용하여 표시되지 않은 어셈블리의 메서드를 호출하거나, 보안 투명 메서드가 형식 또는 메서드에 대한 LinkDemand를 충족합니다. |
|
SecurityTransparentAttribute로 표시된 코드에는 어설션하는 데 필요한 권한이 부여되지 않습니다. |
|
이 규칙은 P/Invoke 등을 통해 네이티브 코드를 직접 호출하는 모든 투명 메서드에 적용됩니다. 이 규칙이 위반되면 수준 2 투명성 모델에서 MethodAccessException이 발생하고 수준 1 투명성 모델에서 UnmanagedCode에 대한 완전 요청이 발생합니다. |
|
예외가 다시 throw되며 예외가 throw 문에 명시적으로 지정되어 있습니다. throw 문에 예외를 지정하여 예외가 다시 throw되면 예외를 throw한 원래 메서드와 현재 메서드 간의 메서드 호출 목록이 손실됩니다. |
|
같은 개체에 대해 System.IDisposable.Dispose 또는 Dispose와 동일한 기능의 메서드(예를 들어, 일부 형식의 Close() 메서드)가 여러 번 호출될 수 있는 코드 경로가 메서드 구현에 포함되어 있습니다. |
|
값 형식에서 명시적인 정적 생성자를 선언합니다. 이 규칙 위반 문제를 해결하려면 모든 정적 데이터를 선언할 때 초기화하고 정적 생성자를 제거합니다. |
|
System.EnterpriseServices.ServicedComponent로부터 상속하는 형식의 메서드가 System.Web.Services.WebMethodAttribute로 표시되어 있습니다. WebMethodAttribute 및 ServicedComponent 메서드에는 컨텍스트와 트랜잭션 흐름에 있어 충돌하는 동작 및 요구 사항이 있으므로 메서드의 동작이 일부 시나리오에서 잘못됩니다. |
|
System.IDisposable을 구현하는 형식이 마찬가지로 IDisposable을 구현하는 형식으로 된 필드를 선언합니다. 필드의 Dispose 메서드가 선언 형식의 Dispose 메서드에 의해 호출되지 않습니다. |
|
생성자가 가상 메서드를 호출할 때 이 메서드를 호출하는 인스턴스의 생성자가 실행되지 않았을 가능성이 있습니다. |
|
System.IDisposable을 구현하고, 관리되지 않는 리소스의 사용을 암시하는 필드를 포함하는 형식이 Object.Finalize에 설명된 대로 종료자를 구현하지 않습니다. |
|
종료는 상속 계층을 통해 전파되어야 합니다. 이를 위해 형식은 자체 Finalize 메서드에서 기본 클래스의 Finalize 메서드를 호출해야 합니다. |
|
이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다. 봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다. |
|
STAThreadAttribute는 응용 프로그램에 대한 COM 스레딩 모델이 단일 스레드 아파트임을 나타냅니다. 이 특성은 Windows Forms을 사용하는 응용 프로그램의 진입점에 있어야 합니다. 이 특성을 생략하면 Windows 구성 요소가 제대로 작동하지 않을 수 있습니다. |
|
serialize할 수 없는 형식의 인스턴스 필드가 serialize할 수 있는 형식에 정의되었습니다. |
|
이 규칙 위반 문제를 해결하려면 해당하는 파생된 형식의 메서드나 생성자에서 기본 형식 GetObjectData 메서드나 serialization 생성자를 호출합니다. |
|
공용 언어 런타임에서 serializable로 인식되도록 하려면 형식이 ISerializable 인터페이스 구현을 통해 사용자 지정 serialization 루틴을 사용하는 경우에도 형식을 SerializableAttribute 특성으로 표시해야 합니다. |
|
serialization 이벤트를 처리하는 메서드에 올바른 시그너처, 반환 형식 또는 노출 수준이 없습니다. |
|
이 규칙 위반 문제를 해결하려면 GetObjectData 메서드를 표시하고 재정의 가능하도록 만든 다음 모든 인스턴스 필드가 serialization 프로세스에 포함되었는지 또는 NonSerializedAttribute 특성으로 명시적으로 표시되었는지 확인합니다. |
|
System.String.Format에 전달된 format 인수에 각 개체 인수에 해당하는 형식 항목이 없거나 각 형식 항목에 해당하는 개체 인수가 없습니다. |
|
이 식은 Single.Nan 또는 Double.Nan에 대해 값을 테스트합니다. 값을 테스트하려면 Single.IsNan(Single) 또는 Double.IsNan(Double)을 사용합니다. |