코드 품질 규칙
.NET 코드 분석은 코드 품질을 향상하기 위한 규칙을 제공합니다. 규칙은 디자인, 세계화, 성능 및 보안과 같은 영역으로 구성됩니다. 어떤 규칙은 .NET API 사용에만 적용되는 반면, 어떤 규칙은 일반 코드 품질에 대한 것입니다.
규칙의 인덱스
다음 표에는 코드 품질 분석 규칙이 나와 있습니다.
규칙 ID 및 경고 | 설명 |
---|---|
CA1000: 정적 멤버를 제네릭 형식으로 선언하지 마십시오. | 제네릭 형식의 정적 멤버를 호출할 때는 형식에 형식 인수를 지정해야 합니다. 유추를 지원하지 않는 제네릭 인스턴스 멤버를 호출할 때는 멤버에 형식 인수를 지정해야 합니다. 이 두 가지 경우에 형식 인수를 지정하기 위한 구문은 서로 다르며 혼동되기 쉽습니다. |
CA1001: 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다. | 클래스가 System.IDisposable 형식인 인스턴스 필드를 선언하고 구현하지만 IDisposable은 구현하지 않습니다. IDisposable 필드를 선언하는 클래스는 관리되지 않는 리소스를 간접적으로 소유하며 IDisposable 인터페이스를 구현해야 합니다. |
CA1002: 제네릭 목록을 노출하지 마십시오. | System.Collections.Generic.List<(Of <(T>))>는 상속이 아닌 성능을 위해 설계된 제네릭 컬렉션입니다. 따라서 List에는 가상 멤버가 포함되지 않습니다. 상속을 위해 디자인된 제네릭 컬렉션이 대신 노출되어야 합니다. |
CA1003: 제네릭 이벤트 처리기 인스턴스를 사용하십시오. | void를 반환 하며 해당 시그니처에 두 개의 매개 변수 (개체가 첫 번째 및 두 번째는 EventArgs에 할당 될 수 있는 형식)를 포함 하는 대리자를 포함 하는 형식을 포함 하는 어셈블리에는 Microsoft.NET Framework 2.0 대상으로 합니다. |
CA1005: 제네릭 형식에 매개 변수를 너무 많이 사용하지 마십시오. | 제네릭 형식에 포함된 형식 매개 변수가 많을수록 각 형식 매개 변수가 무엇을 나타내는지를 파악하거나 기억하기가 더 어렵습니다. 일반적으로 List<T에서와 같이 하나의 형식 매개 변수와 사전 TKey, TValue>>에서와 같이 두 개의 형식 매개 변수가 있는<경우에 분명합니다. 그러나 형식 매개 변수가 세 개 이상이면 대부분의 사용자가 사용하기에 너무 어렵습니다. |
CA1008: 열거형에는 0 값이 있어야 합니다. | 초기화되지 않은 열거형의 기본값은 다른 값 형식과 마찬가지로 0입니다. 플래그 특성을 사용하지 않는 열거형에서는 기본값이 열거형의 유효한 값이 되도록 0 값을 사용하여 멤버를 정의해야 합니다. FlagsAttribute 특성이 적용된 열거형에서 0 값을 가진 멤버를 정의하는 경우에는 열거형에 값이 설정되지 않았음을 나타낼 수 있도록 해당 멤버 이름이 "None"이어야 합니다. |
CA1010: 컬렉션은 제네릭 인터페이스를 구현해야 합니다. | 컬렉션의 유용성을 높이려면 제네릭 컬렉션 인터페이스 중 하나를 구현합니다. 그러면 컬렉션을 사용하여 제네릭 컬렉션 형식을 채울 수 있습니다. |
CA1012: 추상 형식에는 공용 생성자가 없어야 합니다. | 추상 형식에 대한 생성자는 파생된 형식에서만 호출할 수 있습니다. public 생성자에서 형식의 인스턴스를 만들고 사용자는 추상 형식의 인스턴스를 만들 수 없기 때문에 public 생성자가 있는 추상 형식은 잘못 디자인된 것입니다. |
CA1014: 어셈블리를 CLSCompliantAttribute로 표시하십시오. | CLS(공용 언어 사양)는 어셈블리가 여러 프로그래밍 언어에 사용될 경우 준수해야 하는 명명 제한, 데이터 형식 및 규칙을 정의합니다. 모든 어셈블리에는 CLSCompliantAttribute를 사용하여 CLS 규격을 명시적으로 나타내는 것이 좋습니다. 어셈블리에 이 특성이 없으면 해당 어셈블리는 규격을 따르지 않습니다. |
CA1016: 어셈블리를 AssemblyVersionAttribute로 표시하십시오. | .NET에서는 버전 번호를 사용하여 어셈블리를 고유하게 식별하고 강력한 이름의 어셈블리에 있는 형식에 바인딩합니다. 버전 번호는 버전 및 게시자 정책과 함께 사용됩니다. 기본적으로 애플리케이션은 해당 애플리케이션이 빌드될 때 사용된 어셈블리 버전으로만 실행됩니다. |
CA1017: 어셈블리를 ComVisibleAttribute로 표시하십시오. | ComVisibleAttribute는 COM 클라이언트에서 관리 코드에 액세스하는 방식을 결정합니다. 어셈블리에서 COM에 노출할지 여부를 명시적으로 나타내는 것이 좋은 디자인입니다. 전체 어셈블리에 대해 COM 노출 여부를 설정한 다음 개별 형식 및 형식 멤버에 대해 이를 재정의할 수 있습니다. 이 특성이 없으면 COM 클라이언트에서 어셈블리의 내용을 볼 수 있습니다. |
CA1018: 특성을 AttributeUsageAttribute로 표시하십시오. | 사용자 지정 특성을 정의할 때는 해당 특성을 AttributeUsageAttribute로 표시하여 사용자 지정 특성을 적용할 수 있는 소스 코드의 위치를 나타냅니다. 특성의 의미 및 용도에 따라 코드에서의 유효한 위치가 결정됩니다. |
CA1019: 특성 인수의 접근자를 정의하십시오. | 특성에서는 대상에 특성을 적용할 때 지정해야 하는 필수 인수를 정의할 수 있습니다. 이러한 인수는 특성 생성자에 위치 매개 변수로 제공되기 때문에 이러한 인수를 위치 인수라고도 합니다. 모든 필수 인수에 대해 특성은 실행 시간에 인수의 값을 검색할 수 있도록 해당하는 읽기 전용 속성도 제공해야 합니다. 특성에서는 명명된 인수라고 하는 선택적 인수도 정의할 수 있습니다. 이들 인수는 이름으로 특성 생성자에 제공되며 해당하는 읽기/쓰기 특성이 있어야 합니다. |
CA1021: out 매개 변수를 사용하지 마십시오. | out 또는 ref를 사용하여 참조로 형식을 전달하려면 포인터 사용 방법을 알고 있어야 하고, 값 형식과 참조 형식이 어떻게 다른지 알고 있어야 하며, 반환 값이 여러 개인 메서드를 처리할 수 있어야 합니다. 또한 out 매개 변수와 ref 매개 변수의 차이점은 잘 알려져 있지 않습니다. |
CA1024: 적합한 속성을 사용하십시오. | public 또는 protected 메서드가 "Get"으로 시작하는 이름을 사용하고, 매개 변수를 사용하지 않으며, 배열이 아닌 값을 반환합니다. 이 메서드는 속성이 될 수 있는 좋은 예일 수 있습니다. |
CA1027: 열거형을 FlagsAttribute로 표시하십시오. | 열거형은 서로 관련 있는 명명된 상수 집합을 정의하는 값 형식입니다. 명명된 상수를 의미 있게 조합할 수 있는 경우 열거형에 FlagsAttribute를 적용합니다. |
CA1028: 열거형 스토리지는 Int32여야 합니다. | 열거형은 서로 관련 있는 명명된 상수 집합을 정의하는 값 형식입니다. 기본적으로 System.Int32 데이터 형식은 상수 값을 저장하는 데 사용됩니다. 이 내부 형식을 변경할 수 있지만 대부분의 시나리오에서는 변경이 필요하지 않거나 권장되지 않습니다. |
CA1030: 적절한 경우 이벤트를 사용하십시오. | 이 규칙에서는 보통 이벤트에 사용되는 이름을 갖는 메서드를 찾아냅니다. 명확하게 정의된 상태 변경에 대한 응답으로 메서드를 호출할 경우 이 메서드는 이벤트 처리기에서 호출해야 합니다. 메서드를 호출하는 개체는 메서드를 직접 호출하는 대신 이벤트를 발생시켜야 합니다. |
CA1031: 일반적인 예외 형식을 catch하지 마십시오. | 일반 예외는 catch하면 안 됩니다. 보다 구체적인 예외를 catch하거나, 일반적인 예외를 catch 블록의 마지막 문으로 다시 throw해야 합니다. |
CA1032: 표준 예외 생성자를 구현하십시오. | 이들 생성자 집합을 전부 제공하지 못하면 예외를 제대로 처리하기 어려울 수 있습니다. |
CA1033: 인터페이스 메서드는 자식 형식에서 호출할 수 있어야 합니다. | 외부에서 볼 수 있는 unsealed 형식이 public 인터페이스의 명시적 메서드 구현을 제공하면서 외부에서 볼 수 있는 같은 이름의 대체 메서드를 제공하지 않습니다. |
CA1034: 중첩 형식은 노출하지 마십시오. | 중첩 형식은 다른 형식의 범위 내에 선언된 형식입니다. 중첩 형식은 포함하는 형식의 private 구현 정보를 캡슐화하는 데 유용합니다. 이 용도로 사용할 경우 중첩 형식은 외부에 노출되면 안 됩니다. |
CA1036: 비교 가능한 형식에 메서드를 재정의하십시오. | public 또는 protected 형식이 System.IComparable 인터페이스를 구현합니다. 이 형식은 Object.Equals를 재정의하지 않으며 같음, 같지 않음, 보다 작음 또는 보다 큼에 대한 언어별 연산자를 오버로드하지 않습니다. |
CA1040: 빈 인터페이스를 사용하지 마십시오. | 인터페이스에서는 동작이나 사용 계약을 제공하는 멤버를 정의합니다. 인터페이스에 의해 설명되는 기능은 상속 계층 구조에서 형식이 나타나는 위치에 관계없이 모든 형식에서 사용할 수 있습니다. 형식에서는 인터페이스의 멤버에 대한 구현을 제공하여 인터페이스를 구현합니다. 빈 인터페이스는 멤버를 정의하지 않으므로 구현 가능한 계약을 정의하지 않습니다. |
CA1041: ObsoleteAttribute 메시지를 제공하십시오. | 형식 또는 멤버가 ObsoleteAttribute.Message 속성이 지정되지 않은 System.ObsoleteAttribute 특성으로 표시되어 있습니다. ObsoleteAttribute로 표시된 형식 또는 멤버를 컴파일하면 해당 특성의 Message 속성이 표시되어 사용되지 않는 형식 또는 멤버에 대한 정보가 사용자에게 제공됩니다. |
CA1043: 인덱서에 정수 또는 문자열 인수를 사용하십시오. | 인덱서, 즉 인덱싱된 속성은 인덱스에 정수 계열 형식이나 문자열 형식을 사용해야 합니다. 이러한 형식은 대개 데이터 구조를 인덱싱하는 데 사용되며 라이브러리의 유용성을 증가시킵니다. Object 형식은 디자인 타임에 특정 정수 계열 형식이나 문자열 형식을 지정할 수 없는 경우에만 제한적으로 사용해야 합니다. |
CA1044: 속성은 쓰기 전용이면 안 됩니다. | 읽기 전용 속성을 사용하는 것은 가능하고 종종 필요하기도 하지만 쓰기 전용 속성의 사용은 금지되어 있습니다. 사용자에게 값을 설정하도록 허용한 다음 해당 값을 볼 수 없도록 하면 보안상 문제가 있기 때문입니다. 또한 읽기 권한이 없으면 공유 개체의 상태를 볼 수 없으므로 사용하는 데 제한을 받습니다. |
CA1045: 참조로 참조 형식을 전달하지 않습니다. | out 또는 ref를 사용하여 참조로 형식을 전달하려면 포인터 사용 방법을 알고 있어야 하고, 값 형식과 참조 형식이 어떻게 다른지 알고 있어야 하며, 반환 값이 여러 개인 메서드를 처리할 수 있어야 합니다. 일반 사용자를 대상으로 디자인하는 라이브러리 설계자는 사용자가 out 또는 ref 매개 변수를 사용하는 작업에 능숙해질 것으로 기대해서는 안 됩니다. |
CA1046: 참조 형식에 같음 연산자를 오버로드하지 마십시오. | 참조 형식의 경우 같음 연산자의 기본 구현은 대부분 항상 올바릅니다. 기본적으로 두 참조는 같은 개체를 가리킬 경우에만 같습니다. |
CA1047: protected 멤버를 sealed 형식으로 선언하지 마십시오. | 형식에서는 상속하는 형식에서 멤버에 액세스하거나 멤버를 재정의할 수 있도록 하기 위해 protected 멤버를 선언합니다. 정의에 따라 sealed 형식은 상속할 수 없으므로 sealed 형식에 대해 protected 메서드를 호출할 수 없습니다. |
CA1050: 네임스페이스에 형식을 선언하십시오. | 이름 충돌을 방지하고 관련된 형식을 개체 계층 구조로 구성하기 위해 형식은 네임스페이스 안에 선언됩니다. |
CA1051: 표시되는 인스턴스 필드를 선언하지 마십시오. | 필드의 주된 용도는 구현을 세부적으로 설명하는 것입니다. 필드는 private 또는 internal이어야 하고 속성을 통해 노출되어야 합니다. |
CA1052: 정적 소유자 형식은 sealed여야 합니다. | public 또는 protected 형식이 정적 멤버만 포함하며 sealed(C# 참조)(NotInheritable) 한정자로 선언되지 않았습니다. 상속을 고려하지 않은 형식은 sealed 한정자로 표시하여 기본 형식으로 사용되지 않도록 해야 합니다. |
CA1053: 정적 소유자 형식에는 생성자를 사용하면 안 됩니다. | public 또는 중첩된 public 형식에서 정적 멤버만 선언하며 public 또는 protected 기본 생성자를 사용합니다. 호출하는 정적 멤버에 형식의 인스턴스가 필요하지 않기 때문에 생성자가 필요 없습니다. 문자열 오버로드는 안전과 보안을 위해 문자열 인수를 사용하여 URI(Uniform Resource Identifier) 오버로드를 호출해야 합니다. |
CA1054: URI 매개 변수는 문자열이면 안 됩니다. | 메서드가 URI의 문자열 표현을 사용하면 URI 클래스의 인스턴스를 사용하는 해당 오버로드를 제공해야 합니다. 이렇게 하면 서비스가 안전한 방식으로 제공됩니다. |
CA1055: URI 반환 값은 문자열이면 안 됩니다. | 이 규칙에서는 메서드가 URI를 반환한다고 가정합니다. URI의 문자열 표현은 구문 분석 및 인코딩 오류를 발생시키기 쉬우며 보안 문제를 일으킬 수 있습니다. System.Uri 클래스는 이러한 서비스를 안전한 방식으로 제공합니다. |
CA1056: URI 속성은 문자열이면 안 됩니다. | 이 규칙에서는 속성이 URI(Uniform Resource Identifier)를 나타낸다고 가정합니다. URI의 문자열 표현은 구문 분석 및 인코딩 오류를 발생시키기 쉬우며 보안 문제를 일으킬 수 있습니다. System.Uri 클래스는 이러한 서비스를 안전한 방식으로 제공합니다. |
CA1058: 형식은 특정 기본 형식을 확장하면 안 됩니다. | 외부에서 볼 수 있는 형식이 특정 기본 형식을 확장합니다. 다음 방법 중 하나를 사용합니다. |
CA1060: P/Invoke를 NativeMethods 클래스로 이동 | System.Runtime.InteropServices.DllImportAttribute 특성으로 표시된 메서드나 Visual Basic에서 Declare 키워드를 사용하여 정의된 메서드 같은 플랫폼 호출 메서드는 비관리 코드에 액세스합니다. 이러한 메서드는 NativeMethods, SafeNativeMethods 또는 UnsafeNativeMethods 클래스에 속해야 합니다. |
CA1061: 기본 클래스 메서드를 숨기지 마십시오. | 파생된 메서드의 매개 변수 시그니처가 기본 메서드의 매개 변수 시그니처에 있는 해당 형식보다 더 약하게 파생된 형식이라는 점만 다른 경우 기본 형식의 메서드는 파생된 형식에 있는 동일한 이름의 메서드에 의해 숨겨집니다. |
CA1062: public 메서드의 인수의 유효성을 검사하십시오. | 외부에서 볼 수 있는 메서드에 전달되는 모든 참조 인수는 null인지 여부를 검사해야 합니다. |
CA1063: IDisposable을 올바르게 구현하십시오. | 모든 IDisposable 형식은 Dispose 패턴을 올바르게 구현해야 합니다. |
CA1064: 예외는 public이어야 합니다. | 내부 예외는 내부 범위 내에만 표시됩니다. 예외가 내부 범위 밖에 놓이게 되면 예외를 catch하는 데 기본 예외만 사용할 수 있습니다. 내부 예외에서 상속 되 면 Exception, SystemException, 또는 ApplicationException, 외부 코드에 예외를 사용 하 여 수행할 작업을 알고에 충분 한 정보가 없습니다. |
CA1065: 예기치 않은 위치에서 예외를 발생시키지 마십시오. | 예외를 throw하지 않아야 하는 메서드가 예외를 throw했습니다. |
CA1066: Equals를 재정의할 때 IEquatable 구현 | 값 형식은 Equals 메서드를 재정의하지만 IEquatable<T>를 구현하지는 않습니다. |
CA1067: IEquatable을 구현할 때 등호 재정의 | 형식은 IEquatable<T>을 구현하지만 Equals 메서드를 재정의하지 않습니다. |
CA1068: CancellationToken 매개 변수가 마지막으로 와야 합니다. | 메서드에 마지막 매개 변수가 아닌 CancellationToken 매개 변수가 있습니다. |
CA1069: 열거형에는 중복 값이 없어야 합니다. | 열거형에는 동일한 상수 값을 명시적으로 할당받은 여러 멤버가 있습니다. |
CA1070: 이벤트 필드를 가상으로 선언하지 마세요. | 필드와 유사한 이벤트가 가상으로 선언되었습니다. |
CA1200: 접두사로 cref 태그를 사용하지 마십시오. | XML 문서 태그의 cref 특성은 “코드 참조”를 의미합니다. 태그의 내부 텍스트를 형식, 메서드, 속성 등의 코드 요소로 지정합니다. cref 태그는 컴파일러가 참조를 확인하는 것을 방지하므로 접두사와 함께 사용하지 마세요. 또한 접두사를 함께 사용하면 Visual Studio IDE(통합 개발 환경)에서 리팩터링 중에 기호 참조를 찾아 업데이트할 수 없습니다. |
CA1303: 리터럴을 지역화된 매개 변수로 전달하지 마십시오. | 외부에 표시되는 메서드가 문자열 리터럴을 .NET 생성자 또는 메서드에 매개 변수로 전달하며 해당 문자열은 지역화할 수 있어야 합니다. |
CA1304: CultureInfo를 지정하십시오. | 메서드 또는 생성자가 System.Globalization.CultureInfo 매개 변수를 받아들이는 오버로드가 있는 멤버를 호출하지만 CultureInfo 매개 변수를 사용하는 오버로드는 호출하지 않습니다. CultureInfo 또는 System.IFormatProvider 개체가 제공되지 않으면 오버로드된 멤버에서 제공하는 기본값이 모든 로캘에서 원하는 효과를 나타내지 않을 수 있습니다. |
CA1305: IFormatProvider를 지정하십시오. | 메서드 또는 생성자가 System.IFormatProvider 매개 변수를 받아들이는 오버로드가 있는 하나 이상의 멤버를 호출하지만 IFormatProvider 매개 변수를 사용하는 오버로드는 호출하지 않습니다. System.Globalization.CultureInfo 또는 IFormatProvider 개체가 제공되지 않으면 오버로드된 멤버에서 제공하는 기본값이 모든 로캘에서 원하는 효과를 나타내지 않을 수 있습니다. |
CA1307: 명확성을 위해 StringComparison 지정 | 문자열 비교 작업에서 StringComparison 매개 변수를 설정하지 않는 메서드 오버로드를 사용합니다. |
CA1308: 문자열을 대문자로 정규화하십시오. | 문자열은 대문자로 정규화되어야 합니다. 일부 문자는 소문자로 변환될 때 다시 대문자로 변환될 수 없습니다. |
CA1309: 서수 StringComparison을 사용하십시오. | 비언어 문자열 비교 작업에서는 StringComparison 매개 변수를 Ordinal 또는 OrdinalIgnoreCase로 설정하지 않습니다. 매개 변수가 명시적으로 StringComparison.Ordinal 또는 StringComparison.OrdinalIgnoreCase로 설정되기 때문에 코드 실행 속도, 정확도 및 신뢰도가 향상됩니다. |
CA1310: 정확성을 위해 StringComparison 지정 | 문자열 비교 작업에서 StringComparison 매개 변수를 설정하지 않는 메서드 오버로드를 사용하고 기본적으로 문화권별 문자열 비교를 사용합니다. |
CA1311: 문화권 지정 또는 고정 버전 사용 | 문화권을 지정하거나 고정 문화권을 사용하여 ToUpper 또는 ToLower 를 호출할 때 현재 문화권에 대한 암시적 종속성을 방지합니다. |
CA1401: P/Invoke는 노출되지 않아야 합니다. | public 형식의 public 또는 protected 메서드에 System.Runtime.InteropServices.DllImportAttribute 특성(Visual Basic의 선언 키워드에서 구현함)이 있습니다. 이러한 메서드는 노출되지 않아야 합니다. |
CA1416: 플랫폼 호환성 유효성 검사 | 구성 요소에서 플랫폼 종속 API를 사용하면 모든 플랫폼에서 코드가 더 이상 작동하지 않습니다. |
CA1417: P/Invokes에 대한 문자열 매개 변수에서 OutAttribute 를 사용하지 마세요 |
OutAttribute 를 사용하여 값으로 전달된 문자열 매개 변수는 문자열이 인턴 지정된 문자열인 경우 런타임을 불안정하게 만들 수 있습니다. |
CA1418: 유효한 플랫폼 문자열 사용 | 플랫폼 호환성 분석기에는 유효한 플랫폼 이름과 버전이 필요합니다. |
CA1419: 'System.Runtime.InteropServices.SafeHandle'에서 파생된 구체적인 형식에 대한 포함 형식만큼 표시되는 매개 변수가 없는 생성자를 제공합니다. | 파생된 System.Runtime.InteropServices.SafeHandle 형식에 대한 포함 형식만큼 표시되는 매개 변수가 없는 생성자를 제공하면 원본에서 생성된 interop 솔루션에서 성능 및 사용을 향상할 수 있습니다. |
CA1420: 속성, 유형 또는 특성에는 런타임 마샬링이 필요함 | 런타임 마샬링을 사용하지 않도록 설정한 상태로 런타임 마샬링이 필요한 기능을 사용하면 런타임 예외가 발생합니다. |
CA1421: DisableRuntimeMarshallingAttribute가 적용될 때 메서드는 런타임 마샬링을 사용합니다. | 메서드는 런타임 마샬링을 사용하며 런타임 마샬링이 명시적으로 사용하지 않도록 설정됩니다. |
CA1422: 플랫폼 호환성 유효성 검사 | 해당 OS(버전)에서 연결할 수 있는 호출 사이트에서 지정된 OS(버전)에 사용되지 않는 API를 호출하는 것은 권장되지 않습니다. |
CA1501: 상속성을 너무 많이 사용하지 마십시오. | 형식이 상속 계층 구조에서 네 단계보다 아래에 있습니다. 여러 번 중첩된 형식 계층 구조는 추적하고, 이해하고, 유지 관리하기가 어렵습니다. |
CA1502: 지나치게 복잡하게 만들지 마십시오. | 이 규칙은 메서드를 통과하는 선형 독립 경로의 수를 측정하며 조건부 분기의 수와 복잡성에 의해 결정됩니다. |
CA1505: 유지 관리할 수 없는 코드는 사용하지 마십시오. | 형식 또는 메서드에 낮은 유지 관리 인덱스 값이 있습니다. 낮은 유지 관리 인덱스는 형식 또는 메서드가 유지 관리하기 어렵고 다시 디자인될 수 있음을 나타냅니다. |
CA1506: 클래스 결합을 지나치게 많이 사용하지 마십시오. | 이 규칙은 형식 또는 메서드에 들어 있는 고유한 형식 참조의 개수를 계산하여 클래스 결합을 측정합니다. |
CA1507: 문자열 대신 nameof 사용 | 문자열 리터럴은 nameof 식을 사용할 수 있는 인수로 사용됩니다. |
CA1508: 데드 조건부 코드 방지 | 메서드에는 항상 런타임에 true 또는 false 로 계산되는 조건부 코드가 있습니다. 이렇게 하면 조건의 false 분기에서 데드 코드가 발생합니다. |
CA1509: 코드 메트릭 구성 파일의 잘못된 항목 | 코드 메트릭 규칙(예: CA1501, CA1502, CA1505, CA1506)이 잘못된 항목이 있는 CodeMetricsConfig.txt 라는 구성 파일을 제공했습니다. |
CA1510: ArgumentNullException throw 도우미 사용 | Throw 도우미는 새 예외 인스턴스를 생성하는 블록보다 if 더 간단하고 효율적입니다. |
CA1511: ArgumentException throw 도우미 사용 | Throw 도우미는 새 예외 인스턴스를 생성하는 블록보다 if 더 간단하고 효율적입니다. |
CA1512: ArgumentOutOfRangeException throw 도우미 사용 | Throw 도우미는 새 예외 인스턴스를 생성하는 블록보다 if 더 간단하고 효율적입니다. |
CA1513: ObjectDisposedException throw 도우미 사용 | Throw 도우미는 새 예외 인스턴스를 생성하는 블록보다 if 더 간단하고 효율적입니다. |
CA1514: 중복 길이 인수 방지 | 문자열 또는 버퍼의 끝으로 조각화할 때 중복 길이 인수가 사용됩니다. 계산된 길이는 오류가 발생하기 쉬울 수 있으며 필요도 없습니다. |
CA1515: 퍼블릭 형식을 내부로 만드는 것 고려 | 클래스 라이브러리와 달리 애플리케이션의 API는 일반적으로 공개적으로 참조되지 않으므로 형식을 내부로 표시할 수 있습니다. |
CA1700: 열거형 값의 이름을 'Reserved'로 지정하지 마십시오. | 이 규칙에서는 "reserved"라는 단어가 포함된 이름을 갖는 열거형 멤버가 현재 사용되지는 않지만 이후 버전에서 이름이 바뀌거나 제거될 자리 표시자라고 가정합니다. 멤버의 이름을 바꾸거나 멤버를 제거하는 것은 주요 변경에 해당합니다. |
CA1707: 식별자에는 밑줄을 사용할 수 없습니다. | 규칙에 따라 식별자 이름에는 밑줄 문자(_)가 포함될 수 없습니다. 이 규칙에서는 네임스페이스, 형식, 멤버 및 매개 변수를 검사합니다. |
CA1708: 식별자에는 대/소문자만 다른 이름을 사용할 수 없습니다. | 공용 언어 런타임을 대상으로 하는 언어는 대/소문자를 구분하지 않으므로 네임스페이스, 형식, 멤버 및 매개 변수의 식별자가 대/소문자만 달라서는 안 됩니다. |
CA1710: 식별자에는 올바른 접미사를 사용해야 합니다. | 규칙에 따라 특정 기본 형식을 확장하거나 특정 인터페이스를 구현하는 형식 또는 이러한 형식에서 파생되는 형식은 이름에 기본 형식이나 인터페이스와 연관된 접미사를 갖습니다. |
CA1711: 식별자에는 올바른 접미사를 사용해야 합니다. | 규칙에 따라 특정 기본 형식을 확장하거나 특정 인터페이스를 구현하는 형식의 이름 또는 이러한 형식에서 파생되는 형식의 이름만이 예약된 특정 접미사로 끝나야 합니다. 다른 형식 이름에는 이러한 예약된 접미사를 사용하면 안 됩니다. |
CA1712: 열거형 값에 형식 이름을 접두사로 사용하지 마십시오. | 개발 도구에서 형식 정보를 제공하므로 열거형 멤버의 이름에는 형식 이름을 접두사로 사용하지 않습니다. |
CA1713: 이벤트에 Before 또는 After 접두사를 사용하지 마십시오. | 이벤트 이름이 "Before" 또는 "After"로 시작합니다. 특정 시퀀스에서 발생하는 관련 이벤트의 이름을 지정하려면 현재 또는 과거 시제를 사용하여 동작 시퀀스 내의 상대적인 위치를 나타냅니다. |
CA1714: 플래그 열거형에는 복수형 이름을 사용해야 합니다. | public 열거형에 System.FlagsAttribute 특성이 있고 이름이 "s"로 끝나지 않았습니다. FlagsAttribute 특성은 둘 이상의 값을 지정할 수 있음을 나타내므로 이 특성으로 표시된 형식은 복수형 이름을 갖습니다. |
CA1715: 식별자에는 올바른 접두사를 사용해야 합니다. | 외부에 노출되는 인터페이스의 이름이 대문자 "I"로 시작하지 않습니다. 외부에 노출되는 형식 또는 메서드의 제네릭 형식 매개 변수 이름이 대문자 "T"로 시작하지 않습니다. |
CA1716: 식별자는 키워드와 달라야 합니다. | 네임스페이스 이름 또는 형식 이름이 프로그래밍 언어의 예약된 키워드와 일치합니다. 네임스페이스 및 형식에 대한 식별자는 공용 언어 런타임을 대상으로 하는 언어에서 정의된 키워드와 일치하면 안 됩니다. |
CA1717: FlagsAttribute 열거형에만 복수형 이름을 사용해야 합니다. | 명명 규칙은 열거형 이름이 복수형인 경우 여러 열거 값을 동시에 지정할 수 있음을 나타내도록 되어 있습니다. |
CA1720: 식별자에 형식 이름을 포함하면 안 됩니다. | 외부에 노출되는 멤버의 매개 변수 이름에 데이터 형식 이름이 포함되어 있거나 외부에 노출되는 멤버의 이름에 언어에 따라 다른 데이터 형식 이름이 포함되어 있습니다. |
CA1721: 속성 이름은 Get 메서드와 달라야 합니다. | public 또는 protected 멤버의 이름이 "Get"으로 시작하며 이름의 나머지 부분이 public 또는 protected 속성의 이름과 같습니다. "Get" 메서드와 속성은 서로가 분명히 구분되는 이름을 사용해야 합니다. |
CA1724: 형식 이름은 네임스페이스와 달라야 합니다. | 형식 이름은 .NET 네임스페이스의 이름과 달라야 합니다. 이 규칙을 위반하면 라이브러리의 유용성이 저하될 수 있습니다. |
CA1725: 매개 변수 이름은 기본 선언과 일치해야 합니다. | 재정의 계층 구조에서 매개 변수 이름을 일관되게 지정하면 메서드 재정의를 더 편리하게 사용할 수 있습니다. 파생된 메서드의 매개 변수 이름이 기본 선언의 이름과 다르면 메서드가 기본 메서드의 재정의인지 메서드의 새 오버로드인지를 혼동할 수 있습니다. |
CA1727: 명명된 자리 표시자에 대해 PascalCase 사용 | 로깅 메시지 템플릿에서 명명된 자리 표시자에 대해 PascalCase를 사용합니다. |
CA1801: 사용되지 않은 매개 변수를 검토하십시오. | 메서드 시그니처에 메서드 본문에서 사용되지 않는 매개 변수가 있습니다. |
CA1802: 가능하면 리터럴을 사용하십시오. | 필드가 static 및 read-only(Visual Basic의 경우 Shared 및 ReadOnly)로 선언되었으며 컴파일 시간에 계산할 수 있는 값을 사용하여 초기화되어 있습니다. 컴파일 시간에 대상 필드에 할당되는 값을 계산할 수 있으므로 값이 런타임이 아닌 컴파일 시간에 계산되도록 선언을 const(Visual Basic의 경우 Const) 필드로 변경합니다. |
CA1805: 불필요하게 초기화하지 마세요 | .NET 런타임은 생성자를 실행하기 전에 참조 형식의 모든 필드를 기본값으로 초기화합니다. 대부분의 경우 필드를 기본값으로 명시적으로 초기화하는 것은 중복되므로 유지 관리 비용이 늘어나고 성능이 저하될 수 있습니다(예: 어셈블리 크기 증가). |
CA1806: 메서드 결과를 무시하지 마십시오. | 새 개체가 만들어지지만 사용되지 않거나, 새 문자열을 만들고 반환하는 메서드가 호출되고 새 문자열이 사용되지 않거나, COM 또는 P/Invoke 메서드가 사용되지 않는 오류 코드나 HRESULT를 반환합니다. |
CA1810: 참조 형식 정적 필드를 인라인으로 초기화하십시오. | 형식이 명시적인 정적 생성자를 선언하면 JIT(Just-in-Time) 컴파일러는 형식의 각 정적 메서드와 인스턴스 생성자에 검사를 추가하여 정적 생성자를 이전에 호출했는지 확인합니다. 정적 생성자 검사로 인해 성능이 저하될 수 있습니다. |
CA1812: 인스턴스화되지 않은 내부 클래스를 사용하지 마십시오. | 어셈블리 수준 형식의 인스턴스가 어셈블리에서 코드에 의해 만들어지지 않습니다. |
CA1813: 봉인되지 않은 특성을 사용하지 마십시오. | .NET은 사용자 지정 특성을 검색하는 메서드를 제공합니다. 기본적으로 이러한 메서드는 특성 상속 계층을 검색합니다. 특성을 봉인하면 상속 계층을 검색하지 않으므로 성능이 향상될 수 있습니다. |
CA1814: 다차원 배열보다 가변 배열을 사용하십시오. | 가변 배열의 요소에는 배열이 사용됩니다. 요소를 구성하는 배열의 크기는 서로 다를 수 있습니다. 이 경우 일부 데이터 집합에 대한 공간을 절약할 수 있습니다. |
CA1815: 값 형식에서 Equals 또는 같음 연산자를 재정의하십시오. | 값 형식의 경우 Equals의 상속된 구현에서 Reflection 라이브러리를 사용하며 모든 필드의 내용을 비교합니다. Reflection에는 많은 계산이 요구되며 모든 필드의 일치 여부를 비교하는 것이 불필요할 수 있습니다. 사용자가 인스턴스를 비교 또는 정렬하거나 인스턴스를 해시 테이블 키로 사용할 것으로 예측되는 경우에는 값 형식에서 Equals를 구현해야 합니다. |
CA1816: GC.SuppressFinalize를 올바르게 호출하십시오. | Dispose 구현인 메서드가 GC를 호출 하지 않습니다. SuppressFinalize; 또는 Dispose 구현 되지 않는 메서드가 GC를 호출 합니다. SuppressFinalize; 또는 GC를 호출 합니다. SuppressFinalize 및 전달이 (Visual Basic의 Me) 이외의 것입니다. |
CA1819: 속성은 배열을 반환해서는 안 됩니다. | 속성에서 반환된 배열은 속성이 읽기 전용이더라도 쓰기 금지되지 않습니다. 배열을 무단으로 변경하지 못하도록 하려면 속성에서 배열의 복사본을 반환해야 합니다. 일반적으로 사용자는 이러한 속성을 호출할 경우 성능에 부정적인 영향을 준다는 것을 인식하지 못합니다. |
CA1820: 문자열 길이를 사용하여 문자열이 비었는지 테스트하십시오. | String.Length 속성이나 String.IsNullOrEmpty 메서드를 사용하여 문자열을 비교하는 것이 Equals를 사용하는 것보다 훨씬 더 빠릅니다. |
CA1821: 빈 종료자를 제거하십시오. | 개체 수명을 추적할 때에는 추가로 성능 오버헤드가 발생하므로 가능한 경우 종료자를 사용하지 마십시오. 빈 종료자는 아무런 장점 없이 오버헤드만 가중시킵니다. |
CA1822: 멤버를 static으로 표시하십시오. | 인스턴스 데이터에 액세스하지 않거나 인스턴스 메서드를 호출하지 않는 멤버는 static(Visual Basic의 경우 Shared)으로 표시할 수 있습니다. 메서드를 static으로 표시하면 컴파일러는 이러한 멤버에 대한 비가상 호출 사이트를 내보냅니다. 이 경우 성능이 중요한 코드에서 성능이 크게 향상될 수 있습니다. |
CA1823: 사용되지 않는 전용 필드를 사용하지 마십시오. | 어셈블리에서 액세스되지 않는 것으로 보이는 전용 필드가 발견되었습니다. |
CA1824: 어셈블리를 NeutralResourcesLanguageAttribute로 표시하십시오. | NeutralResourcesLanguage 특성은 어셈블리에 대한 중립 문화권의 리소스를 표시하는 데 사용된 언어를 리소스 관리자에 알립니다. 이렇게 하면 로드한 첫 리소스에 대한 찾기 성능을 향상시킬 수 있으며 작업이 간단해집니다. |
CA1825: 길이가 0인 배열 할당 방지 | 길이가 0인 배열을 초기화하면 불필요한 메모리 할당이 발생합니다. 대신, Array.Empty를 호출하여 정적으로 할당된 빈 배열 인스턴스를 사용합니다. 메모리 할당은 이 메서드의 모든 호출에서 공유됩니다. |
CA1826: Linq 열거 가능 메서드 대신 속성 사용 | Enumerable LINQ 메서드가 동등하지만 더욱 효율적인 속성을 지원하는 형식에서 사용되었습니다. |
CA1827: Any를 사용할 수 있는 경우 Count/LongCount를 사용하지 마세요. | Any 메서드가 더욱 효율적인 위치에서 Count 또는 LongCount 메서드가 사용되었습니다. |
CA1828: AnyAsync를 사용할 수 있는 경우 CountAsync/LongCountAsync를 사용하지 마세요. | AnyAsync 메서드가 더욱 효율적인 위치에서 CountAsync 또는 LongCountAsync 메서드가 사용되었습니다. |
CA1829: Enumerable.Count 메서드 대신 Length/Count 속성을 사용합니다. | Count LINQ 메서드가 동등하지만 더욱 효율적인 Length 또는 Count 속성을 지원하는 형식에서 사용되었습니다. |
CA1830: StringBuilder에서 강력한 형식의 Append 및 Insert 메서드 오버로드를 선호합니다. | Append 및 Insert는 String 이외의 여러 형식에 대한 오버로드를 제공합니다. 가능하면 ToString() 및 문자열 기반 오버로드를 사용하는 대신 강력한 형식의 오버로드를 사용하는 것이 좋습니다. |
CA1831: 적절한 경우 문자열에 범위 기반 인덱서 대신 AsSpan 사용 | 문자열에 범위-인덱서를 사용하고 해당 값을 ReadOnlySpan<char> 형식에 암시적으로 할당하는 경우 Substring 메서드는 문자열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1832: 배열의 ReadOnlySpan 또는 ReadOnlyMemory 부분을 가져오기 위해 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용합니다. | 배열에 범위-인덱서를 사용하고 해당 값을 ReadOnlySpan<T> 또는 ReadOnlyMemory<T> 형식에 암시적으로 할당하는 경우 GetSubArray 메서드는 배열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1833: 배열의 범위 또는 메모리 부분을 가져오기 위해 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용합니다. | 배열에 범위-인덱서를 사용하고 해당 값을 Span<T> 또는 Memory<T> 형식에 암시적으로 할당하는 경우 GetSubArray 메서드는 배열의 요청된 부분 복사본을 생성하는 Slice 대신 사용됩니다. |
CA1834: 단일 문자열에 StringBuilder.Append(char) 사용 | StringBuilder에는 char 을 인수로 사용하는 Append 오버로드가 있습니다. 성능상의 이유로 char 오버로드를 호출하는 것이 좋습니다. |
CA1835: ‘ReadAsync’ 및 ‘WriteAsync’에 ‘메모리’ 기반 오버로드를 사용하세요 | ‘Stream’에 첫 번째 인수로 ‘Memory<Byte>’를 사용하는 ‘ReadAsync’ 오버로드와 첫 번째 인수로 ‘ReadOnlyMemory<Byte>’를 사용하는 ‘WriteAsync’ 오버로드가 있습니다. 더 효율적인 메모리 기반 오버로드를 호출하는 것이 좋습니다. |
CA1836: 사용 가능한 경우 Count 대신 IsEmpty 를 사용하세요 |
개체에 항목이 포함되는지를 확인하는 데는 Count , Length , Count<TSource>(IEnumerable<TSource>) 또는 LongCount<TSource>(IEnumerable<TSource>)보다 더 효율적인 IsEmpty 속성을 사용하는 것이 좋습니다. |
CA1837: Process.GetCurrentProcess().Id 대신 Environment.ProcessId 를 사용하세요 |
Environment.ProcessId 는 Process.GetCurrentProcess().Id 보다 더 간단하고 더 빠릅니다. |
CA1838: P/Invokes에 StringBuilder 매개 변수를 사용하지 마세요 |
'StringBuilder'를 마샬링하면 항상 네이티브 버퍼 복사본이 생성되어 하나의 마샬링 작업에 여러 번 할당됩니다. |
CA1839: Process.GetCurrentProcess().MainModule.FileName 대신 Environment.ProcessPath 사용 | Environment.ProcessPath 는 Process.GetCurrentProcess().MainModule.FileName 보다 더 간단하고 더 빠릅니다. |
CA1840: Thread.CurrentThread.ManagedThreadId 대신 Environment.CurrentManagedThreadId 사용 | Environment.CurrentManagedThreadId 는 Thread.CurrentThread.ManagedThreadId 보다 간단하고 효율적입니다. |
CA1841: 사전 Contains 메서드 사용 | 또는 Values 컬렉션에 Keys 대한 호출 Contains 은 종종 사전 자체에서 호출 ContainsKey 하는 ContainsValue 것보다 더 비쌀 수 있습니다. |
CA1842: 단일 작업에서 'WhenAll'을 사용하지 마세요. | 단일 작업과 함께 사용하면 WhenAll 성능이 저하될 수 있습니다. 대신 작업을 대기하거나 반환합니다. |
CA1843: 단일 작업에서 'WaitAll'을 사용하지 마세요. | 단일 작업과 함께 사용하면 WaitAll 성능이 저하될 수 있습니다. 대신 작업을 대기하거나 반환합니다. |
CA1844: 'Stream'을 서브클래싱할 때 비동기 메서드의 메모리 기반 재정의 제공 | 성능을 향상하려면 'Stream'을 서브클래싱할 때 메모리 기반 비동기 메서드를 재정의합니다. 그런 다음, 메모리 기반 메서드를 기준으로 배열 기반 메서드를 구현합니다. |
CA1845: 범위 기반 ‘string.Concat’을 사용하세요. | Substring 및 연결 연산자 대신 AsSpan 및 string.Concat 을 사용하는 것이 더 효율적입니다. |
CA1846: Substring 보다 AsSpan 선호 |
AsSpan 이 Substring 보다 더 효율적입니다. Substring 은 O(n) 문자열 복사를 수행하지만 AsSpan 은 복사를 수행하지 않으며 상수 비용을 포함합니다. 또한 AsSpan 은 힙 할당을 수행하지 않습니다. |
CA1847: 단일 문자 조회에 char 리터럴 사용 | 단일 문자를 검색할 때 String.Contains(string) 대신 String.Contains(char) 를 사용합니다. |
CA1848: LoggerMessage 대리자 사용 | 성능 향상을 위해 대리자를 LoggerMessage 사용합니다. |
CA1849: 비동기 메서드에 있을 때 비동기 메서드 호출 | 이미 비동기인 메서드에서 다른 메서드에 대한 호출은 각각의 비동기 버전(있는 경우)에 대한 호출이어야 합니다. |
CA1850: ComputeHash 보다 정적 HashData 메서드 선호 |
ComputeHash 를 호출하기 위해 HashAlgorithm 인스턴스를 만들고 관리하는 것보다 정적 HashData 메서드를 사용하는 것이 더 효율적입니다. |
CA1851: IEnumerable 컬렉션의 여러 열거 가능 |
컬렉션의 IEnumerable 가능한 여러 열거형입니다. 여러 열거를 방지하는 구현을 사용하는 것이 좋습니다. |
CA1852: 내부 형식 봉인 | 어셈블리 외부에서 액세스할 수 없고 포함된 어셈블리 내에 하위 형식이 없는 형식은 봉인되지 않습니다. |
CA1853: 'Dictionary.ContainsKey(key)'에 대한 불필요한 호출 | Dictionary.Remove(key) 는 Dictionary.ContainsKey(key) 로 보호하지 않아도 됩니다. Dictionary<TKey,TValue>.Remove(TKey)는 키가 이미 있는지 여부를 확인하고 키가 없으면 throw하지 않습니다. |
CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' 메서드를 선호합니다. | 'ContainsKey' 확인으로 보호되는 사전 인덱서 액세스보다 'TryGetValue'를 선호합니다. 'ContainsKey'와 인덱서는 모두 키를 조회하므로 'TryGetValue'를 사용하면 추가 조회가 방지됩니다. |
CA1855: Span<T>.Fill() 대신 Span<T>.Clear() 사용 | Span<T>.Fill(T)를 호출하여 범위의 요소를 기본값으로 채우는 것보다 Span<T>.Clear()를 호출하는 것이 더 효율적입니다. |
CA1856: ConstantExpected 특성의 잘못된 사용 | ConstantExpectedAttribute 매개 변수에 특성이 올바르게 적용되지 않습니다. |
CA1857: 매개 변수는 최적의 성능을 위해 상수를 기대합니다. | 잘못된 인수가 주석이 추가된 매개 변수에 전달됩니다 ConstantExpectedAttribute. |
CA1858: IndexOf 대신 StartsWith 사용 | 문자열이 지정된 접두사로 시작하는지 여부를 확인하기 위해 호출하는 것보다 호출 String.StartsWith String.IndexOf 하는 것이 더 효율적입니다. |
CA1859: 성능 향상을 위해 가능한 경우 구체적인 형식 사용 | 코드는 인터페이스 형식 또는 추상 형식을 사용하므로 불필요한 인터페이스 호출 또는 가상 호출이 발생합니다. |
CA1860: 'Enumerable.Any()' 확장 메서드를 사용하지 마세요. | 컬렉션 형식에 요소가 있는지 여부를 확인하기 위해 호출 Enumerable.Any 하는 Length Count 것보다 사용하거나 IsEmpty (가능한 경우) 사용하는 것이 더 효율적이고 명확합니다. |
CA1861: 상수 배열을 인수로 사용하지 않습니다. | 인수로 전달된 상수 배열은 다시 사용되지 않으므로 성능 오버헤드를 의미합니다. 성능을 향상시키려면 '정적 읽기 전용' 필드에 추출하는 것이 좋습니다. |
CA1862: ‘StringComparison’ 메서드 오버로드를 사용하여 대/소문자를 구분하지 않는 문자열 비교를 수행합니다. | 코드가 대/소문자를 구분하지 않는 문자열 비교를 호출 ToLower() 하거나 ToUpper() 수행하면 불필요한 할당이 수행됩니다. |
CA1863: ‘CompositeFormat’ 사용 | 서식 비용을 줄이려면 인스턴스를 인수 String.Format StringBuilder.AppendFormat 로 캐시하고 사용합니다CompositeFormat. |
CA1864: 'IDictionary.TryAdd(TKey, TValue)' 메서드를 선호합니다. | Dictionary<TKey,TValue>.Add 둘 다 Dictionary<TKey,TValue>.ContainsKey(TKey) 중복되는 조회를 수행합니다. 값이 추가되었는지 여부를 나타내는 값을 반환 bool 하는 호출Dictionary<TKey,TValue>.TryAdd이 더 효율적입니다. TryAdd 는 키가 이미 있는 경우 키의 값을 덮어쓰지 않습니다. |
CA1865-CA1867: char 오버로드 사용 | char 오버로드는 단일 문자가 있는 문자열에 대해 더 나은 성능 오버로드입니다. |
CA1868: 집합에 대한 'Contains'에 대한 불필요한 호출 | ICollection<T>.Remove(T) 둘 다 ISet<T>.Add(T) 조회를 수행하므로 미리 호출 ICollection<T>.Contains(T) 하는 것이 중복됩니다. 항목이 추가 또는 제거되었는지 여부를 나타내는 부울 값을 반환하는 호출 또는 Remove(T) 직접 호출 Add(T) 이 더 효율적입니다. |
CA1869: 'JsonSerializerOptions' 인스턴스 캐시 및 재사용 | System.Text.Json은 내부적으로 serialization 관련 메타데이터를 제공된 인스턴스에 캐시하므로 코드가 여러 번 실행되는 경우 직렬화 또는 역직렬화에 로컬 인스턴스 JsonSerializerOptions 를 사용하면 애플리케이션 성능이 크게 저하될 수 있습니다. |
CA1870: 캐시된 'SearchValues' 인스턴스 사용 | 캐시된 SearchValues<T> 인스턴스를 사용하면 값을 'IndexOfAny' 또는 'ContainsAny'에 직접 전달하는 것보다 더 효율적입니다. |
CA1871: nullable 구조체를 'ArgumentNullException.ThrowIfNull'에 전달하지 마세요. | 'ArgumentNullException.ThrowIfNull'은 'object'를 허용하므로 null 허용 구조체를 전달하면 값이 boxed될 수 있습니다. |
CA1872: 'BitConverter.ToString'을 기반으로 하는 호출 체인보다 'Convert.ToHexString' 및 'Convert.ToHexStringLower' 선호 | 바이트를 16진수 문자열 표현으로 인코딩하는 경우 또는 Convert.ToHexStringLower 사용합니다Convert.ToHexString. 이러한 메서드는 대시 String.ToLower및 을 대체하는 데 함께 String.Replace 사용하는 BitConverter.ToString 것보다 더 효율적이고 할당 친화적입니다. |
CA2000: 범위를 벗어나기 전에 개체를 삭제하십시오. | 개체의 종료자가 실행되지 못하도록 하는 예외 이벤트가 발생할 수 있기 때문에 개체에 대한 모든 참조가 범위를 벗어나기 전에 개체를 명시적으로 삭제해야 합니다. |
CA2002: 약한 ID를 가진 개체를 잠그지 마십시오. | 애플리케이션 도메인 경계를 가로질러 직접 액세스할 수 있는 개체를 약한 ID를 가진 개체라고 합니다. 약한 ID를 가진 개체에 대해 잠금을 가져오려고 시도하는 스레드는 같은 개체에 대해 잠금을 가진 다른 애플리케이션 도메인의 스레드에 의해 차단될 수 있습니다. |
CA2007: 작업을 직접 기다리지 마세요. | 비동기 메서드가 Task를 직접 대기합니다. 비동기 메서드가 Task를 직접 대기하는 경우 작업을 만든 스레드와 같은 스레드에서 연속이 발생합니다. 이 동작으로 인해 성능이 저하될 수 있으며 UI 스레드에서 교착 상태가 발생할 수 있습니다. Task.ConfigureAwait(Boolean)를 호출하여 연속에 대한 의도를 알리는 것이 좋습니다. |
CA2008: TaskScheduler를 전달하지 않고 작업을 만들지 마세요. | 작업 만들기 또는 연속 작업에서 TaskScheduler 매개 변수를 지정하지 않는 메서드 오버로드를 사용합니다. |
CA2009: ImmutableCollection 값에서 ToImmutableCollection을 호출하지 마세요. | ToImmutable 메서드가 System.Collections.Immutable 네임스페이스의 변경이 불가능한 컬렉션에서 불필요하게 호출되었습니다. |
CA2011: setter 내에서 속성을 할당하지 마세요. | 속성이 자체 set 접근자 내에서 실수로 값을 할당받았습니다. |
CA2012: ValueTasks를 올바르게 사용 | 멤버 호출에서 반환되는 ValueTasks는 직접 대기해야 합니다. ValueTask를 여러 번 사용하거나 완료된 것으로 알려지기 전에 결과에 직접 액세스하려고 하면 예외 또는 손상이 발생할 수 있습니다. 이러한 ValueTask를 무시하면 기능 버그가 표시될 수 있으며 성능이 저하될 수 있습니다. |
CA2013: 값 형식에 ReferenceEquals를 사용하지 마세요. | System.Object.ReferenceEquals를 사용하여 값을 비교할 때 objA 및 objB가 값 형식이면 ReferenceEquals 메서드로 전달되기 전에 boxing됩니다. 즉, objA와 objB가 값 형식의 동일한 인스턴스를 나타내는 경우에도 ReferenceEquals 메서드는 false를 반환합니다. |
CA2014: 루프에 stackalloc를 사용하지 마세요 | Stackalloc에 의해 할당된 스택 공간은 현재 메서드 호출이 끝날 때만 릴리스됩니다. 루프에서 사용하면 바인딩되지 않은 스택이 증가하고 최종 스택 오버플로 조건이 발생할 수 있습니다. |
CA2015: MemoryManager<T>에서 파생된 형식에 대해 종료자를 정의하지 마세요 | 파생된 MemoryManager<T> 형식에 종료자를 추가하면 메모리가 여전히 사용 Span<T>중인 동안 해제될 수 있습니다. |
CA2016: CancellationToken 매개 변수를 사용하는 메서드로 전달 | CancellationToken 매개 변수를 사용하는 메서드에 해당 메서드를 전달하여 작업 취소 알림이 올바르게 전파되도록 하거나, 명시적으로 CancellationToken.None 을 전달하여 의도적으로 토큰을 전파하지 않음을 나타냅니다. |
CA2017: 매개 변수 개수 불일치 | 로깅 메시지 템플릿에 제공된 매개 변수 수가 명명된 자리 표시자 수와 일치하지 않습니다. |
CA2018: Buffer.BlockCopy 에 대한 count 인수는 복사할 바이트 수를 지정해야 합니다. |
Buffer.BlockCopy 를 사용하는 경우 count 인수는 복사할 바이트 수를 지정합니다. 요소 크기가 정확히 1바이트인 배열의 count 인수에 대해서만 Array.Length 를 사용해야 합니다. byte , sbyte , bool 배열에는 크기가 1바이트인 요소가 있습니다. |
CA2019: ThreadStatic 필드는 인라인 초기화를 사용하면 안 됨 |
ThreadStaticAttribute 주석이 추가된 필드는 static (visual Basic에서는 Shared ) 생성자에서 인라인으로 또는 명시적으로 초기화됩니다. |
CA2020: IntPtr/UIntPtr의 기본 제공 연산자로 인한 동작 변경 방지 | .NET 7에 추가된 일부 기본 제공 연산자는 .NET 6 및 이전 버전의 사용자 정의 연산자와 다르게 작동합니다. 오버플로하는 동안 선택되지 않은 컨텍스트에서 throw하는 데 사용한 일부 연산자는 확인된 컨텍스트 내에서 래핑되지 않는 한 더 이상 throw되지 않습니다. 이전에 확인된 컨텍스트에서 throw하지 않은 일부 연산자는 이제 선택되지 않은 컨텍스트 내에서 래핑되지 않는 한 throw됩니다. |
CA2021: 호환되지 않는 형식을 사용하여 Enumerable.Cast<T> 또는 Enumerable.OfType<T>를 호출하지 마세요. | 입력 컬렉션의 형식과 호환되지 않는 형식 매개 변수를 호출 Enumerable.Cast<TResult>(IEnumerable) 하거나 Enumerable.OfType<TResult>(IEnumerable) 지정합니다. |
CA2022: Stream.Read를 사용하여 읽지 않도록 방지 | 호출은 Stream.Read 요청된 것보다 적은 바이트를 반환할 수 있으므로 반환 값을 확인하지 않으면 신뢰할 수 없는 코드가 생성됩니다. |
CA2100: 보안상 취약한 부분이 있는지 SQL 쿼리를 검토하십시오. | 메서드가 메서드에 대한 문자열 인수로부터 만들어진 문자열을 사용하여 System.Data.IDbCommand.CommandText 속성을 설정합니다. 이 규칙에서는 문자열 인수에 사용자 입력이 포함된 것으로 가정합니다. 사용자 입력으로부터 만들어진 SQL 명령 문자열은 SQL 삽입 공격에 취약합니다. |
CA2101: P/Invoke 문자열 인수에 마샬링 지정 | 플랫폼 호출 멤버가 부분 신뢰 호출자를 허용하고, 문자열 매개 변수를 사용하고, 문자열을 명시적으로 마샬링하지 않습니다. 이렇게 하면 보안상 위험할 수 있습니다. |
CA2109: 표시되는 이벤트 처리기를 검토하십시오. | public 또는 protected 이벤트 처리 메서드를 발견했습니다. 이벤트 처리 메서드는 반드시 필요한 경우를 제외하고 노출하면 안 됩니다. |
CA2119: private 인터페이스를 만족하는 메서드를 봉인하십시오. | 상속할 수 있는 public 형식에서는 internal(Visual Basic의 경우 Friend) 인터페이스의 재정의 가능한 메서드 구현을 제공합니다. 이 규칙 위반 문제를 해결하려면 어셈블리 외부에서 메서드가 재정의되지 않도록 합니다. |
CA2153: 손상된 상태 예외 처리 방지 | CSE(손상된 상태 예외)는 프로세스에 메모리 손상이 있음을 나타냅니다. 프로세스 충돌을 허용하는 대신 catch하면 공격자가 손상된 메모리 영역에 익스플로잇을 배치할 수 있는 경우 보안 취약점이 발생할 수 있습니다. |
CA2200: 스택 정보를 유지하도록 다시 throw하십시오. | 예외가 다시 throw되며 예외가 throw 문에 명시적으로 지정되어 있습니다. throw 문에 예외를 지정하여 예외가 다시 throw되면 예외를 throw한 원래 메서드와 현재 메서드 간의 메서드 호출 목록이 손실됩니다. |
CA2201: 예약된 예외 형식을 발생시키지 마십시오. | 따라서 원래 오류를 감지하고 디버깅하기 어렵게 됩니다. |
CA2207: 값 형식 정적 필드를 인라인으로 초기화하십시오. | 값 형식에서 명시적인 정적 생성자를 선언합니다. 이 규칙 위반 문제를 해결하려면 모든 정적 데이터를 선언할 때 초기화하고 정적 생성자를 제거합니다. |
CA2208: 인수 예외를 올바르게 인스턴스화하십시오. | 예외 형식에서 파생되거나 파생 ArgumentException 되는 예외 형식의 기본(매개 변수가 없는) 생성자에 대한 호출이 발생하거나, 잘못된 문자열 인수가 예외 형식 ArgumentException 의 매개 변수가 있는 생성자에 전달됩니다. |
CA2211: 비상수 필드는 노출되면 안 됩니다. | 상수도 아니고 읽기 전용도 아닌 static 필드는 스레드로부터 안전하지 않습니다. 이러한 필드에 대한 액세스는 신중하게 제어해야 하며 클래스 개체에 대한 액세스를 동기화하는 고급 프로그래밍 기술을 필요로 합니다. |
CA2213: 삭제 가능한 필드는 삭제해야 합니다. | System.IDisposable을 구현하는 형식이 마찬가지로 IDisposable을 구현하는 형식으로 된 필드를 선언합니다. 필드의 Dispose 메서드가 선언 형식의 Dispose 메서드에 의해 호출되지 않습니다. |
CA2214: 재정의 가능한 메서드를 생성자에서 호출하지 마십시오. | 생성자가 가상 메서드를 호출할 때 메서드를 호출하는 인스턴스의 생성자가 실행되지 않았을 수 있습니다. |
CA2215: Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다. | 삭제 가능한 형식으로부터 상속하는 형식은 자신의 Dispose 메서드에서 기본 형식의 Dispose 메서드를 호출해야 합니다. |
CA2216: 삭제 가능한 형식은 종료자를 선언해야 합니다. | System.IDisposable을 구현하고, 관리되지 않는 리소스의 사용을 암시하는 필드를 포함하는 형식이 Object.Finalize에 설명된 대로 종료자를 구현하지 않습니다. |
CA2217: 열거형을 FlagsAttribute로 표시하지 마십시오. | 외부에서 볼 수 있는 열거형이 FlagsAttribute로 표시되어 있고, 2의 거듭제곱 또는 열거형에 정의된 다른 값의 조합이 아닌 값이 하나 이상 들어 있습니다. |
CA2218: Equals를 재정의할 때 GetHashCode를 재정의하십시오. | 퍼블릭 형식은 System.Object.Equals를 재정의하지만 System.Object.GetHashCode를 재정의하지 않습니다. |
CA2219: exception 절에서 예외를 발생시키지 마십시오. | finally 또는 fault 절에서 예외가 발생하는 경우 새 예외가 활성 예외를 숨깁니다. 필터 절에서 예외가 발생하면 런타임에서 자동으로 예외를 catch합니다. 따라서 원래 오류를 감지하고 디버깅하기 어렵게 됩니다. |
CA2224: 같음 연산자를 오버로드할 때 Equals를 재정의하십시오. | 퍼블릭 형식은 같음 연산자를 구현하지만 System.Object.Equals를 재정의하지 않습니다. |
CA2225: 연산자 오버로드에는 명명된 대체 항목이 있습니다. | 연산자 오버로드가 감지되었으며 예상되는 이름의 대체 메서드를 찾을 수 없습니다. 명명된 대체 멤버는 해당 연산자와 동일한 기능에 액세스할 수 있도록 해주며, 오버로드된 연산자가 지원되지 않는 언어로 프로그래밍하는 개발자에게 제공됩니다. |
CA2226: 연산자에는 대칭 오버로드가 있어야 합니다. | 형식이 같음 연산자 또는 같지 않음 연산자를 구현하면서 그 반대 연산자를 구현하지 않습니다. |
CA2227: 컬렉션 속성은 읽기 전용이어야 합니다. | 쓰기 가능한 컬렉션 속성을 통해 사용자는 컬렉션을 다른 컬렉션으로 바꿀 수 있습니다. 읽기 전용 속성은 컬렉션을 바꾸지 못하도록 하지만 개별 멤버를 설정하는 것은 여전히 가능합니다. |
CA2229: serialization 생성자를 구현하십시오. | 이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다. 봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다. |
CA2231: ValueType.Equals를 재정의할 때 같음 연산자를 오버로드하십시오. | 값 형식이 Object.Equals를 재정의하지만 같음 연산자를 구현하지 않습니다. |
CA2234: 문자열 대신 System.Uri 개체를 전달하십시오. | 이름에 "uri", "URI", "urn", "URN", "url" 또는 "URL"이 포함된 문자열 매개 변수가 있는 메서드가 호출되었습니다. 메서드의 선언 형식에 System.Uri 매개 변수를 가진 해당 메서드 오버로드가 들어 있습니다. |
CA2235: 모두 serialize할 수 없는 필드로 표시하십시오. | serialize할 수 없는 형식의 인스턴스 필드가 serialize할 수 있는 형식에 정의되었습니다. |
CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오. | 공용 언어 런타임에서 serializable로 인식되도록 하려면 형식이 ISerializable 인터페이스 구현을 통해 사용자 지정 serialization 루틴을 사용하는 경우에도 형식을 SerializableAttribute 특성으로 표시해야 합니다. |
CA2241: 형식 메서드에 올바른 인수를 제공하십시오. | System.String.Format에 전달된 format 인수에 각 개체 인수에 해당하는 형식 항목이 없거나 각 형식 항목에 해당하는 개체 인수가 없습니다. |
CA2242: NaN에 대해 정확하게 테스트하십시오. | 이 식은 Single.Nan 또는 Double.Nan에 대해 값을 테스트합니다. 값을 테스트하려면 Single.IsNan(Single) 또는 Double.IsNan(Double)을 사용합니다. |
CA2243: 특성 문자열 리터럴이 올바르게 구문 분석되어야 합니다. | 특성의 문자열 리터럴 매개 변수가 URL, GUID 또는 버전에 대해 구문을 올바르게 분석하지 않습니다. |
CA2244: 인덱싱된 요소 초기화를 중복하지 마세요. | 개체 이니셜라이저에 동일한 상수 인덱스를 포함하는 두 개 이상의 인덱싱된 요소 이니셜라이저가 있습니다. 마지막 이니셜라이저 외에 모두 중복됩니다. |
CA2245: 자체에 속성을 할당하지 마세요. | 속성이 실수로 속성 자체에 할당받았습니다. |
CA2246: 동일한 문에 기호와 해당 멤버를 할당하지 마세요. | 동일한 문에서는 기호 및 해당 멤버(필드 또는 속성)를 할당하지 않는 것이 좋습니다. 멤버 액세스가 할당 전 기호의 이전 값을 사용하거나 해당 문에 있는 할당의 새 값을 사용해야 했는지 분명하지 않습니다. |
CA2247: TaskCompletionSource 생성자로 전달된 인수는 TaskContinuationOptions 열거형이 아닌 TaskCreationOptions 열거형이어야 합니다. | TaskCompletionSource에는 기본 작업을 제어하는 TaskCreationOptions를 사용하는 생성자와 작업에 저장된 개체 상태를 사용하는 생성자가 포함됩니다. 실수로 TaskCreationOptions 대신 TaskContinuationOptions를 전달하면 호출이 옵션을 상태로 처리합니다. |
CA2248: Enum.HasFlag에 올바른 열거형 인수 제공 | HasFlag 메서드 호출에 인수로 전달된 열거형 형식이 호출하는 열거형 형식과 다릅니다. |
CA2249: String.IndexOf 대신 String.Contains를 사용하는 것이 좋습니다. | 결과가 substring의 존재 여부를 확인하는 데 사용되는 string.IndexOf 호출은 string.Contains 로 바꿀 수 있습니다. |
CA2250: ThrowIfCancellationRequested 사용 |
ThrowIfCancellationRequested 는 토큰이 취소되었는지 여부를 자동으로 확인하고, 취소된 경우 OperationCanceledException 을 throw합니다. |
CA2251: String.Compare 대신 String.Equals 사용 |
String.Compare 의 결과를 0과 비교하는 대신 String.Equals 를 사용하는 것이 보다 명확하고 빠릅니다. |
CA2252: 미리 보기 기능 옵트인 | 미리 보기 API를 사용하기 전에 미리 보기 기능을 옵트인합니다. |
CA2253: 명명된 자리 표시자는 숫자 값이 아니어야 합니다. | 로깅 메시지 템플릿의 명명된 자리 표시자는 숫자 문자로만 구성해서는 안 됩니다. |
CA2254: 템플릿은 정적 식이어야 합니다. | 로깅 메시지 템플릿은 호출마다 달라서는 안 됩니다. |
CA2255: ModuleInitializer 특성을 라이브러리에서 사용해서는 안 됩니다. |
모듈 이니셜라이저는 애플리케이션 코드가 실행되기 전에 애플리케이션의 구성 요소가 초기화되도록 하기 위해 애플리케이션 코드에서 사용됩니다. |
CA2256: 부모 인터페이스에 선언된 모든 멤버는 DynamicInterfaceCastableImplementation 특성 인터페이스에 구현이 있어야 합니다. | 형식을 구현하는 DynamicInterfaceCastableImplementationAttribute 형식에 대한 인터페이스 구현으로 작동하는 특성이 있는 형식입니다 IDynamicInterfaceCastable . 따라서 구현하는 형식이 그렇지 않으면 제공하지 않으므로 상속된 인터페이스에 정의된 모든 멤버의 구현을 IDynamicInterfaceCastable 제공해야 합니다. |
CA2257: 'DynamicInterfaceCastableImplementationAttribute'가 있는 인터페이스에 정의된 멤버는 'static'이어야 합니다. | 구현 IDynamicInterfaceCastable 하는 형식이 메타데이터에서 동적 인터페이스를 구현하지 않을 수 있으므로 이 형식에 정의된 명시적 구현이 아닌 인스턴스 인터페이스 멤버에 대한 호출은 런타임에 실패할 수 있습니다. 런타임 오류를 방지하려면 새 인터페이스 멤버 static 를 표시합니다. |
CA2258: Visual Basic에서 'DynamicInterfaceCastableImplementation' 인터페이스를 제공하는 것은 지원되지 않습니다. | 기능 DynamicInterfaceCastableImplementationAttribute 특성 인터페이스를 제공하려면 Visual Basic에서 지원되지 않는 기본 인터페이스 멤버 기능이 필요합니다. |
CA2259: ThreadStatic 이 정적 필드에만 사용되는지 확인 |
ThreadStaticAttribute는 (Shared Visual Basic에서) 필드에만 영향을 줍니다 static . 인스턴스 필드에 적용된 특성은 동작에 영향을 주지 않습니다. |
CA2260: 제네릭 수학 인터페이스를 올바르게 구현 | 제네릭 수학 인터페이스를 사용하려면 파생 형식 자체를 자체 되풀이 형식 매개 변수에 사용해야 합니다. |
CA2261: ConfigureAwaitOptions.SuppressThrowing 를 Task<TResult> 와 함께 사용하지 마세요. |
이 ConfigureAwaitOptions.SuppressThrowing 옵션은 제네릭 Task<TResult> 에서 지원되지 않습니다. 이 경우 잘못된 TResult 옵션이 반환될 수 있기 때문에 지원되지 않습니다. |
CA2262: 제대로 설정 MaxResponseHeadersLength |
값이 MaxResponseHeadersLength 올바르게 제공되었는지 확인합니다. 이 값은 킬로바이트 단위로 측정됩니다. |
CA2263: 형식이 알려진 경우 제네릭 오버로드를 선호함 | 제네릭 오버로드를 사용하는 것은 향상된 컴파일 시간 검사를 통해 보다 명확하고 형식이 안전한 코드를 승격하기 때문에 형식이 알려지면 인수를 전달하는 System.Type 것이 좋습니다. |
CA2264: null을 허용하지 않는 값을 'ArgumentNullException.ThrowIfNull'에 전달하지 마세요. | 전달된 인수가 'null'이면 'ArgumentNullException.ThrowIfNull'이 throw됩니다. null을 허용하지 않는 구조체와 'nameof()' 및 'new' 식과 같은 특정 구문은 null이 아닌 것으로 알려져 있으므로 'ArgumentNullException.ThrowIfNull'은 throw되지 않습니다. |
CA2265: 비교하거나 비교 Span<T> 하지 마세요.null default |
범위를 null 의도한 것과 비교하거나 default 수행하지 않을 수 있습니다. default 리터럴은 null 암시적으로 .로 Span<T>.Empty 변환됩니다. |
CA2300: 안전하지 않은 역직렬 변환기 BinaryFormatter를 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2301: BinaryFormatter.Binder를 먼저 설정하지 않고 BinaryFormatter.Deserialize를 호출하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2302: BinaryFormatter.Deserialize를 호출하기 전에 BinaryFormatter.Binder가 설정되어 있는지 확인합니다. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2305: 안전하지 않은 역직렬 변환기 LosFormatter를 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2310: 안전하지 않은 역직렬 변환기 NetDataContractSerializer를 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2311: 먼저 NetDataContractSerializer.Binder를 설정하지 않고 역직렬화하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2312: 역직렬화하기 전에 NetDataContractSerializer.Binder가 설정되어 있는지 확인합니다. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2315: 안전하지 않은 역직렬 변환기 ObjectStateFormatter를 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2321: SimpleTypeResolver를 사용하여 JavaScriptSerializer로 역직렬화하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2322: 역직렬화하기 전에 JavaScriptSerializer가 SimpleTypeResolver로 초기화되지 않았는지 확인합니다. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2326: None 이외의 TypeNameHandling 값을 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2327: 안전하지 않은 JsonSerializerSettings를 사용하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2328: JsonSerializerSettings가 안전한지 확인 | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2329: 안전하지 않은 구성을 사용하여 JsonSerializer로 역직렬화하지 마세요. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2330: 역직렬화할 때 JsonSerializer에 보안 구성이 있는지 확인합니다. | 안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. |
CA2350: DataTable.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다. | 신뢰할 수 없는 입력으로 DataTable을 역직렬화하면 공격자는 악의적인 입력을 만들어 서비스 거부 공격을 수행할 수 있습니다. 알 수 없는 원격 코드 실행 취약성이 있을 수 있습니다. |
CA2351: DataSet.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다. | 신뢰할 수 없는 입력으로 DataSet을 역직렬화하면 공격자는 악의적인 입력을 만들어 서비스 거부 공격을 수행할 수 있습니다. 알 수 없는 원격 코드 실행 취약성이 있을 수 있습니다. |
CA2352: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음 | SerializableAttribute로 표시된 클래스 또는 구조체에 DataSet 또는 DataTable 필드나 속성이 포함되어 있으며 GeneratedCodeAttribute가 없습니다. |
CA2353: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable | XML serialization 특성 또는 데이터 계약 특성으로 표시된 클래스 또는 구조체에 DataSet 또는 DataTable 필드나 속성이 포함되어 있습니다. |
CA2354: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있습니다. | 직렬화된 System.Runtime.Serialization.IFormatter로 역직렬화하고 캐스트된 형식의 개체 그래프에 DataSet 또는 DataTable이 포함될 수 있습니다. |
CA2355: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable | 캐스팅되거나 지정된 형식의 개체 그래프에 DataSet 또는 DataTable이 포함될 수 있는 경우 역직렬화합니다. |
CA2356: 웹 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable | 또는 을 System.Web.Services.WebMethodAttribute System.ServiceModel.OperationContractAttribute 참조 DataSet DataTable할 수 있는 매개 변수가 있거나 있는 메서드입니다. |
CA2361: DataSet.ReadXml()을 포함하는 자동 생성된 클래스가 신뢰할 수 없는 데이터와 함께 사용되지 않도록 하기 | 신뢰할 수 없는 입력으로 DataSet을 역직렬화하면 공격자는 악의적인 입력을 만들어 서비스 거부 공격을 수행할 수 있습니다. 알 수 없는 원격 코드 실행 취약성이 있을 수 있습니다. |
CA2362: 자동 생성된 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음 | BinaryFormatter를 사용하여 신뢰할 수 없는 입력을 역직렬화할 때 역직렬화된 개체 그래프에 DataSet 또는 DataTable이 포함되어 있으면 공격자가 악의적인 페이로드를 만들어 원격 코드 실행 공격을 수행할 수 있습니다. |
CA3001: SQL 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력 및 SQL 명령으로 작업하는 경우 SQL 삽입 공격에 유의해야 합니다. SQL 삽입 공격은 악성 SQL 명령을 실행하여 애플리케이션의 보안 및 무결성을 손상시킬 수 있습니다. |
CA3002: XSS 취약성에 대한 코드 검토 | 웹 요청의 신뢰할 수 없는 입력을 사용하여 작업하는 경우 XSS(사이트 간 스크립팅) 공격에 주의해야 합니다. XSS 공격은 신뢰할 수 없는 입력을 원시 HTML 출력에 삽입하여 공격자가 악성 스크립트를 실행하거나 웹 페이지의 콘텐츠를 악의적으로 수정할 수 있습니다. |
CA3003: 파일 경로 삽입 취약성에 대한 코드 검토 | 웹 요청의 신뢰할 수 없는 입력을 사용하여 작업하는 경우 사용자가 제어하는 입력을 사용한 파일 경로 지정에 유의해야 합니다. |
CA3004: 정보 공개 취약성에 대한 코드 검토 | 예외 정보를 공개하면 공격자가 애플리케이션의 내부 정보를 파악할 수 있으므로 공격자가 다른 취약성을 악용할 수 있습니다. |
CA3005: LDAP 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하여 작업하는 경우 LDAP(Lightweight Directory Access Protocol) 삽입 공격에 유의해야 합니다. 공격자가 정보 디렉터리에 대해 악성 LDAP 문을 실행할 수 있습니다. 사용자 입력을 사용하여 디렉터리 서비스에 액세스할 수 있는 동적 LDAP 문을 생성하는 애플리케이션이 특히 취약합니다. |
CA3006: 프로세스 명령 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하여 작업하는 경우 명령 삽입 공격에 유의해야 합니다. 명령 삽입 공격은 기본 운영 체제에서 서버의 보안 및 무결성을 손상하는 악성 명령을 실행할 수 있습니다. |
CA3007: 공개 리디렉션 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하는 경우 오픈 리디렉션 취약성에 유의해야 합니다. 공격자가 오픈 리디렉션 취약성을 악용해 사용자의 웹 사이트를 사용하여 합법적인 URL의 모양을 제공하지만 방문자를 피싱 또는 기타 악성 웹 페이지로 리디렉션할 수 있습니다. |
CA3008: XPath 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하는 경우 XPath 삽입 공격에 유의해야 합니다. 신뢰할 수 없는 입력을 사용하여 XPath 쿼리를 생성하면 공격자가 의도하지 않은 결과를 반환하도록 쿼리를 악의적으로 조작하고 쿼리된 XML의 내용을 공개할 수 있습니다. |
CA3009: XML 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하는 경우 XML 삽입 공격에 유의해야 합니다. |
CA3010: XAML 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하여 작업하는 경우 XAML 삽입 공격에 유의해야 합니다. XAML은 개체 인스턴스화 및 실행을 직접적으로 나타내는 태그 언어입니다. 즉, XAML로 생성된 요소는 시스템 리소스(예: 네트워크 액세스 및 파일 시스템 IO)와 상호 작용할 수 있습니다. |
CA3011: DLL 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하는 경우 신뢰할 수 없는 코드 로딩에 유의해야 합니다. 웹 애플리케이션이 신뢰할 수 없는 코드를 로드하는 경우 공격자는 악의적인 DLL을 프로세스에 삽입하고 악성 코드를 실행할 수 있습니다. |
CA3012: regex 삽입 취약성에 대한 코드 검토 | 신뢰할 수 없는 입력을 사용하는 경우 regex 삽입 공격에 유의해야 합니다. 공격자가 regex 삽입을 사용하여 정규식을 악의적으로 수정하거나 regex를 의도하지 않은 결과와 일치시키거나 regex가 CPU를 과도하게 소비하여 서비스 거부 공격을 일으킬 수 있습니다. |
CA3061: URL로 스키마를 추가하지 마세요. | Add 메서드의 안전하지 않은 오버로드는 위험한 외부 참조를 일으킬 수 있으므로 사용하지 마세요. |
CA3075: 안전하지 않은 DTD 처리 | 안전하지 않은 DTDProcessing 인스턴스를 사용하거나 외부 엔터티 원본을 참조하는 경우 파서는 신뢰할 수 없는 입력을 수락하고 중요한 정보를 공격자에게 공개할 수 있습니다. |
CA3076: 안전하지 않은 XSLT 스크립트 실행 | .NET 애플리케이션에서 XSLT(Extensible Stylesheet Language Transformations)를 안전하지 않게 실행하는 경우 프로세서는 공격자에게 중요한 정보를 공개할 수 있는 신뢰할 수 없는 URI 참조를 해결하여 서비스 거부 및 사이트 간 공격으로 이어질 수 있습니다. |
CA3077: API 디자인, XML 문서 및 XML 텍스트 판독기의 안전하지 않은 처리 | XMLDocument 및 XMLTextReader에서 파생된 API를 디자인할 경우 DtdProcessing에 주의해야 합니다. 외부 엔터티 원본을 참조하거나 확인할 때 안전하지 않은 DTDProcessing 인스턴스를 사용하거나 XML에서 안전하지 않은 값을 설정하면 정보가 공개될 수 있습니다. |
CA3147: ValidateAntiForgeryToken으로 동사 처리기 표시 | ASP.NET MVC 컨트롤러를 설계할 때 교차 사이트 요청 위조 공격에 유의해야 합니다. 교차 사이트 요청 위조 공격은 인증된 사용자의 악의적인 요청을 ASP.NET MVC 컨트롤러로 보낼 수 있습니다. |
CA5350: 취약한 암호화 알고리즘 사용 안 함 | 오늘날 여러 가지 이유로 약한 암호화 알고리즘 및 해시 함수가 사용되지만 데이터의 무결성과 기밀성을 보장하기 위해서는 이 방법을 사용하지 않아야 합니다. 이 규칙은 코드에 TripleDES, SHA1 또는 RIPEMD160 알고리즘이 있을 때 발생합니다. |
CA5351: 손상된 암호화 알고리즘을 사용하지 마세요 | 끊어진 암호화 알고리즘은 안전하지 않은 것으로 간주되므로 사용해서는 안 됩니다. 이 규칙은 코드에 MD5 해시 알고리즘 또는 DES나 RC2 암호화 알고리즘이 있을 때 트리거됩니다. |
CA5358: 안전하지 않은 암호화 모드를 사용하지 마세요. | 안전하지 않은 암호화 모드를 사용하지 마세요. |
CA5359: 인증서 유효성 검사를 사용하지 않도록 설정하지 마세요. | 인증서는 서버의 ID를 인증하는 데 도움이 될 수 있습니다. 클라이언트는 서버 인증서의 유효성을 검사하여 요청이 의도한 서버로 전송되도록 해야 합니다. ServerCertificateValidationCallback이 항상 true 를 반환하는 경우 모든 인증서가 유효성 검사를 통과합니다. |
CA5360: 역직렬화에서 위험한 메서드를 호출하지 마세요. | 안전하지 않은 deserialization은 신뢰할 수 없는 데이터를 사용하여 애플리케이션의 논리를 남용하거나 DoS(서비스 거부) 공격을 가하거나 역직렬화될 때 임의 코드를 실행하는 경우 발생하는 취약성입니다. 악의적인 사용자가 제어하는 신뢰할 수 없는 데이터를 애플리케이션에서 역직렬화할 때 이러한 deserialization 기능을 남용하는 경우가 많습니다. 특히 deserialization 중에 위험한 메서드를 호출합니다. 안전하지 않은 deserialization 공격에 성공하면 공격자가 DoS 공격, 인증 바이패스, 원격 코드 실행과 같은 공격을 수행할 수 있습니다. |
CA5361: 강력한 암호화의 Schannel 사용을 사용하지 않도록 설정 안 함 | Switch.System.Net.DontEnableSchUseStrongCrypto 를 true 로 설정하면 나가는 TLS(전송 계층 보안) 연결에서 사용되는 암호화를 약하게 합니다. 더 취약한 암호화는 애플리케이션과 서버 간 통신의 기밀성을 손상해 공격자가 중요한 데이터를 더 쉽게 도청할 수 있도록 합니다. |
CA5362: 역직렬화된 개체 그래프의 잠재적 참조 주기 | 신뢰할 수 없는 데이터를 역직렬화하는 경우 역직렬화된 개체 그래프를 처리하는 모든 코드가 무한 루프로 이동하지 않고 참조 주기를 처리해야 합니다. 여기에는 deserialization 콜백의 일부인 코드와 deserialization 완료 후 개체 그래프를 처리하는 코드가 모두 포함됩니다. 그렇지 않으면 공격자가 참조 주기를 포함하는 악성 데이터를 사용하여 서비스 거부 공격을 수행할 수 있습니다. |
CA5363: 요청 유효성 검사를 사용하지 않도록 설정하지 마세요. | 요청 유효성 검사는 HTTP 요청을 검사하고 교차 사이트 스크립팅 등 삽입 공격으로 이어질 수 있는 잠재적으로 위험한 콘텐츠가 포함되어 있는지 확인하는 ASP.NET의 기능입니다. |
CA5364: 사용되지 않는 보안 프로토콜을 사용하지 마세요. | TLS(전송 계층 보안)는 가장 일반적으로 HTTPS(Hypertext Transfer Protocol Secure)를 사용하여 컴퓨터 간의 통신을 보호합니다. TLS의 이전 프로토콜 버전은 TLS 1.2 및 TLS 1.3보다 안전하지 않으며 새로운 취약성이 있을 가능성이 큽니다. 위험을 최소화하려면 이전 프로토콜 버전을 사용하지 마세요. |
CA5365: HTTP 헤더 검사를 사용하지 않도록 설정 안 함 | HTTP 헤더 검사는 응답 헤더에 있는 캐리지 리턴 및 줄 바꿈 문자(\r 및 \n)의 인코딩을 사용하도록 설정합니다. 이 인코딩 헤더에 포함 된 신뢰할 수 없는 데이터를 표시 하는 애플리케이션을 악용 하는 삽입 공격을 방지 하는 데 도움이 됩니다. |
CA5366: 데이터 세트 읽기 XML에 XmlReader 사용 | 신뢰할 수 없는 DataSet 데이터로 XML을 읽으면 위험한 외부 참조를 로드할 수 있으며, 보안 확인자를 사용 XmlReader 하거나 DTD 처리를 사용하지 않도록 설정하여 제한해야 합니다. |
CA5367: 포인터 필드를 사용하여 형식을 직렬화하지 마세요. | 이 규칙은 포인터 필드 또는 속성이 있는 직렬화 가능한 클래스가 있는지를 확인합니다. NonSerializedAttribute로 표시된 정적 멤버 또는 필드와 같이 직렬화할 수 없는 멤버는 포인터가 될 수 있습니다. |
CA5368: 페이지에서 파생된 클래스에 대해 ViewStateUserKey 설정 | ViewStateUserKey 속성을 설정하면 공격자가 공격을 생성하는 데 변수를 사용할 수 없도록 개별 사용자의 뷰 상태 변수에 식별자를 할당할 수 있어 애플리케이션에 대한 공격을 방지할 수 있습니다. 그렇지 않으면 교차 사이트 요청 위조 취약성이 발생합니다. |
CA5369: 역직렬화에 XmlReader 사용 | 신뢰할 수 없는 DTD 및 XML 스키마를 처리하면 위험한 외부 참조를 로드할 수 있습니다. 이 참조는 보안 확인자가 있는 XmlReader를 사용하거나 DTD 및 XML 인라인 스키마 처리를 사용하지 않도록 설정하여 제한해야 합니다. |
CA5370: 판독기 유효성 검사에 XmlReader 사용 | 신뢰할 수 없는 DTD 및 XML 스키마를 처리하면 위험한 외부 참조를 로드할 수 있습니다. 이 위험한 로드는 XmlReader를 안전한 확인자와 함께 사용하거나 DTD 및 XML 인라인 스키마 처리를 사용하지 않도록 설정한 상태로 사용하여 제한해야 합니다. |
CA5371: 스키마 읽기에 XmlReader 사용 | 신뢰할 수 없는 DTD 및 XML 스키마를 처리하면 위험한 외부 참조를 로드할 수 있습니다. XmlReader를 안전한 확인자와 함께 사용하거나 DTD 및 XML 인라인 스키마 처리를 사용하지 않도록 설정한 상태로 사용하여 이를 제한해야 합니다. |
CA5372: XPathDocument에 XmlReader 사용 | 신뢰할 수 없는 데이터에서 XML을 처리하면 위험한 외부 참조가 로드될 수 있습니다. 이 참조는 보안 확인자와 함께 XmlReader를 사용하거나 DTD 처리를 사용하지 않도록 설정하여 제한될 수 있습니다. |
CA5373: 사용되지 않는 키 파생 함수를 사용하지 마세요. | 이 규칙은 취약한 키 파생 메서드 System.Security.Cryptography.PasswordDeriveBytes 및 Rfc2898DeriveBytes.CryptDeriveKey 의 호출을 탐지합니다. System.Security.Cryptography.PasswordDeriveBytes에서 취약한 알고리즘 PBKDF1을 사용했습니다. |
CA5374: XslTransform 사용 안 함 | 이 규칙은 System.Xml.Xsl.XslTransform이 코드에서 인스턴스화되는지 확인합니다. System.Xml.Xsl.XslTransform은 이제 사용되지 않으며 사용할 수 없습니다. |
CA5375: 계정 공유 액세스 서명을 사용하지 마세요. | 계정 SAS는 서비스 SAS에서 허용되지 않는 Blob 컨테이너, 테이블, 큐, 파일 공유에서 읽기, 쓰기, 삭제 작업에 대한 액세스 권한을 위임할 수 있습니다. 그러나 컨테이너 수준 정책을 지원하지 않으며 유연성이 적고 부여된 사용 권한에 대한 제어 수준이 낮습니다. 악의적인 사용자가 사용할 경우 스토리지 계정이 쉽게 손상됩니다. |
CA5376: SharedAccessProtocol HttpsOnly 사용 | SAS는 HTTP에서 일반 텍스트로 전송할 수 없는 중요한 데이터입니다. |
CA5377: 컨테이너 수준 액세스 정책 사용 | 컨테이너 수준 액세스 정책은 언제든지 수정하거나 철회할 수 있습니다. 이 정책은 향상된 유연성을 제공하며 부여된 사용 권한에 대한 제어 수준도 높습니다. |
CA5378: ServicePointManagerSecurityProtocols를 사용하지 않도록 설정하지 마세요. | Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols 를 true 로 설정하면 WCF(Windows Communication Framework)의 TLS(전송 계층 보안) 연결이 TLS 1.0 사용으로 제한됩니다. 해당 버전의 TLS는 사용되지 않습니다. |
CA5379: 약한 키 파생 함수 알고리즘을 사용하지 마세요. | Rfc2898DeriveBytes 클래스는 기본적으로 SHA1 알고리즘을 사용하도록 설정됩니다. SHA256 이상을 사용하는 생성자의 일부 오버로드에서 사용할 해시 알고리즘을 지정해야 합니다. HashAlgorithm 속성에는 get 접근자만 있고 overridden 한정자는 없습니다. |
CA5380: 루트 저장소에 인증서를 추가하지 마세요. | 이 규칙은 신뢰할 수 있는 루트 인증 기관 인증서 저장소에 인증서를 추가하는 코드를 탐지합니다. 기본적으로 신뢰할 수 있는 루트 인증 기관 인증서 저장소는 Microsoft 루트 인증서 프로그램의 요구 사항을 충족하는 퍼블릭 CA 세트로 구성됩니다. |
CA5381: 인증서가 루트 저장소에 추가되지 않았는지 확인 | 이 규칙은 신뢰할 수 있는 루트 인증 기관 인증서 저장소에 인증서를 잠재적으로 추가하는 코드를 탐지합니다. 기본적으로 신뢰할 수 있는 루트 인증 기관 인증서 저장소는 Microsoft 루트 인증서 프로그램의 요구 사항을 충족하는 퍼블릭 CA(인증 기관) 세트로 구성됩니다. |
CA5382: ASP.NET Core에서 보안 쿠키 사용 | HTTPS를 통해 사용할 수 있는 애플리케이션은 보안 쿠키를 사용해야 하며, 이러한 쿠키는 TLS(전송 계층 보안)를 통해서만 쿠키를 전송해야 함을 브라우저에 표시합니다. |
CA5383: ASP.NET Core에서 보안 쿠키 사용 확인 | HTTPS를 통해 사용할 수 있는 애플리케이션은 보안 쿠키를 사용해야 하며, 이러한 쿠키는 TLS(전송 계층 보안)를 통해서만 쿠키를 전송해야 함을 브라우저에 표시합니다. |
CA5384: DSA(디지털 서명 알고리즘)를 사용하지 마세요. | DSA는 취약한 비대칭형 암호화 알고리즘입니다. |
CA5385: 충분한 키 크기로 Rivest–Shamir-Adleman(RSA) 알고리즘 사용 | 2048비트보다 작은 RSA 키는 무차별 암호 대입 공격(brute force attack)에 더 취약합니다. |
CA5386: SecurityProtocolType 값 하드코딩 방지 | TLS(전송 계층 보안)는 가장 일반적으로 HTTPS(Hypertext Transfer Protocol Secure)를 사용하여 컴퓨터 간의 통신을 보호합니다. 프로토콜 버전 TLS 1.0 및 TLS 1.1은 사용되지 않으며 TLS 1.2 및 TLS 1.3은 최신 상태입니다. 나중에 TLS 1.2 및 TLS 1.3은 더 이상 사용되지 않을 수 있습니다. 애플리케이션을 안전하게 유지하려면 프로토콜 버전을 하드 코드하지 말고 .NET Framework v4.7.1 이상을 대상으로 지정합니다. |
CA5387: 반복 수가 부족한 약한 키 파생 함수를 사용하지 마세요. | 이 규칙은 반복 횟수가 100,000보다 작은 Rfc2898DeriveBytes에 의해 암호화 키가 생성되었는지 확인합니다. 반복 횟수를 높이면 생성된 암호화 키를 추측하려고 시도하는 사전 공격을 완화할 수 있습니다. |
CA5388: 약한 키 파생 함수를 사용할 때 충분한 반복 횟수 확인 | 이 규칙은 100,000 미만일 수 있는 반복 횟수로 암호화 키가 생성 Rfc2898DeriveBytes 되었는지 확인합니다. 반복 횟수를 높이면 생성된 암호화 키를 추측하려고 시도하는 사전 공격을 완화할 수 있습니다. |
CA5389: 대상 파일 시스템 경로에 보관 항목의 경로를 추가하지 마세요. | 파일 경로는 상대적일 수 있고 예상 파일 시스템 대상 경로 외부의 파일 시스템 액세스를 초래하여 lay-and-wait 기법을 통해 악의적으로 구성이 변경되고 원격 코드 실행이 이루어질 수 있습니다. |
CA5390: 암호화 키를 하드 코드하지 마세요. | 대칭 알고리즘이 성공하려면 비밀 키가 발신자와 수신자에게만 알려져야 합니다. 키가 하드 코드되면 쉽게 검색됩니다. 컴파일된 이진 파일인 경우에도 악의적인 사용자가 쉽게 추출할 수 있습니다. 프라이빗 키가 손상되면 암호화 텍스트를 직접 암호 해독할 수 있으며 더 이상 보호되지 않습니다. |
CA5391: ASP.NET Core MVC 컨트롤러에서 위조 방지 토큰 사용 | 위조 방지 토큰의 POST 유효성을 검사하지 않고 , PUT PATCH 또는 DELETE 요청을 처리하면 사이트 간 요청 위조 공격에 취약할 수 있습니다. 교차 사이트 요청 위조 공격은 인증된 사용자의 악의적인 요청을 ASP.NET Core MVC 컨트롤러로 보낼 수 있습니다. |
CA5392: P/Invokes에 DefaultDllImportSearchPaths 특성 사용 | 기본적으로 DllImportAttribute를 사용하는 P/Invoke 함수는 로드할 라이브러리의 현재 작업 디렉터리를 포함하여 많은 디렉터리를 검색합니다. 이는 특정 애플리케이션에서 DLL 하이재킹으로 이어지는 보안 문제가 될 수 있습니다. |
CA5393: 안전하지 않은 DllImportSearchPath 값을 사용하지 마세요. | 기본 DLL 검색 디렉터리 및 어셈블리 디렉터리에 악성 DLL이 있을 수 있습니다. 또는 애플리케이션이 실행되는 위치에 따라 애플리케이션의 디렉터리에 악성 DLL이 있을 수 있습니다. |
CA5394: 안전하지 않은 임의성을 사용하지 마세요. | 암호화적으로 약한 의사 난수 생성기를 사용하면 공격자가 보안에 민감한 값이 생성될 것을 예측할 수 있습니다. |
CA5395: 작업 메서드에 대한 HttpVerb 특성 누락 | 데이터를 생성, 편집, 삭제 또는 수정하는 모든 작업 메서드는 위조 방지 특성을 사용하여 교차 사이트 요청 위조 공격으로부터 보호되어야 합니다. GET 작업 수행은 부작용이 없고 영구 데이터를 수정하지 않는 안전한 작업이어야 합니다. |
CA5396: HttpCookie에 대해 HttpOnly를 true로 설정 | 심층 방어 수단으로 보안에 중요한 HTTP 쿠키가 HttpOnly로 표시되어 있는지 확인합니다. 이는 웹 브라우저에서 스크립트가 쿠키에 액세스하는 것을 허용하지 않아야 함을 나타냅니다. 삽입된 악성 스크립트는 쿠키를 도용하는 일반적인 방법입니다. |
CA5397: 사용되지 않는 SslProtocols 값을 사용하지 마세요. | TLS(전송 계층 보안)는 가장 일반적으로 HTTPS(Hypertext Transfer Protocol Secure)를 사용하여 컴퓨터 간의 통신을 보호합니다. TLS의 이전 프로토콜 버전은 TLS 1.2 및 TLS 1.3보다 안전하지 않으며 새로운 취약성이 있을 가능성이 큽니다. 위험을 최소화하려면 이전 프로토콜 버전을 사용하지 마세요. |
CA5398: 하드 코딩된 SslProtocols 값 방지 | TLS(전송 계층 보안)는 가장 일반적으로 HTTPS(Hypertext Transfer Protocol Secure)를 사용하여 컴퓨터 간의 통신을 보호합니다. 프로토콜 버전 TLS 1.0 및 TLS 1.1은 사용되지 않으며 TLS 1.2 및 TLS 1.3은 최신 상태입니다. 나중에 TLS 1.2 및 TLS 1.3은 더 이상 사용되지 않을 수 있습니다. 애플리케이션을 안전하게 유지하려면 프로토콜 버전을 하드 코드하지 마세요. |
CA5399: HttpClient 인증서 해지 목록 확인을 사용하지 않도록 설정 | 해지된 인증서를 더 이상 신뢰할 수 없습니다. 공격자가 HTTPS 통신에서 악성 데이터를 전달하거나 중요한 데이터를 도용하는 데 사용할 수 있습니다. |
CA5400: HttpClient 인증서 해지 목록 확인을 사용하지 않도록 설정하지 않았는지 확인 | 해지된 인증서를 더 이상 신뢰할 수 없습니다. 공격자가 HTTPS 통신에서 악성 데이터를 전달하거나 중요한 데이터를 도용하는 데 사용할 수 있습니다. |
CA5401: 기본값이 아닌 IV와 함께 CreateEncryptor를 사용하지 마세요. | 대칭형 암호화는 항상 반복할 수 없는 초기화 벡터를 사용하여 사전 공격을 방지해야 합니다. |
CA5402: 기본 IV와 함께 CreateEncryptor 사용 | 대칭형 암호화는 항상 반복할 수 없는 초기화 벡터를 사용하여 사전 공격을 방지해야 합니다. |
CA5403: 인증서를 하드 코딩하지 마세요. | X509Certificate 또는 X509Certificate2 생성자의 data 또는 rawData 매개 변수가 하드 코드됩니다. |
CA5404: 토큰 유효성 검사를 사용하지 않도록 설정하지 않음 | 토큰 유효성 검사를 제어하는 TokenValidationParameters 속성은 false 로 설정하면 안 됩니다. |
CA5405: 항상 대리자에서 토큰 유효성 검사를 건너뛰지 않음 | 할당되거나 항상 반환true 된 AudienceValidator LifetimeValidator 콜백입니다. |
IL3000: 단일 파일로 게시할 때 어셈블리 파일 경로에 액세스하지 마세요. | 단일 파일로 게시할 때 어셈블리 파일 경로에 액세스하지 마세요. |
IL3001: 단일 파일로 게시할 때 어셈블리 파일 경로에 액세스하지 마세요. | 단일 파일로 게시할 때 어셈블리 파일 경로에 액세스하지 마세요. |
IL3002: 단일 파일로 게시할 때 'RequiresAssemblyFilesAttribute'로 주석이 추가된 멤버를 호출하지 마세요. | 단일 파일로 게시할 때 ‘RequiresAssemblyFilesAttribute’로 주석이 지정된 멤버를 호출하지 마세요. |
IL3003: 'RequiresAssemblyFilesAttribute' 주석은 모든 인터페이스 구현 또는 재정의에서 일치해야 합니다. | 모든 인터페이스 구현 또는 재정의에서 ‘RequiresAssemblyFilesAttribute’ 주석이 일치해야 합니다. |
범례
다음 표에서는 참조 문서의 각 규칙에 대해 제공되는 정보 유형을 보여 줍니다.
항목 | 설명 |
---|---|
Type | 규칙의 TypeName입니다. |
규칙 ID | 규칙의 고유 식별자입니다. RuleId 및 범주는 소스에서 경고를 표시하지 않으려는 경우에 사용됩니다. |
범주 | 규칙의 범주(예: 보안)입니다. |
수정 사항이 주요 변경인지 여부 | 규칙의 위반에 대한 수정이 주요 변경 내용인지 여부입니다. 주요 변경 내용은 위반의 원인이 된 대상에 대해 종속성이 있으며 새로 수정된 버전으로 다시 컴파일되지 않거나 변경으로 인해 런타임에 실패할 수 있는 어셈블리를 의미합니다. 여러 수정 사항을 사용할 수 있고 그중에 호환성이 손상되는 변경 내용과 그렇지 않은 것이 각각 하나 이상 있는 경우에는 ‘호환성이 손상되는 변경’과 ‘작업을 중단하지 않는 변경’이 모두 지정됩니다. |
원인 | 규칙에서 경고를 생성하게 만드는 특정 관리 코드입니다. |
설명 | 경고 뒤에 있는 문제를 설명합니다. |
위반 문제를 해결하는 방법 | 규칙을 충족하고 경고 생성을 방지하는 소스 코드 변경 방법을 설명합니다. |
경고를 표시하지 않는 경우 | 규칙에서 경고를 표시하지 않아도 안전한 경우에 대해 설명합니다. |
예제 코드 | 규칙을 위반하는 예제와 규칙을 충족하는 수정된 예제입니다. |
관련 규칙 | 관련 규칙입니다. |
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET