CA3004: 정보 공개 취약성에 대한 코드 검토
속성 | 값 |
---|---|
규칙 ID | CA3004 |
제목 | 코드에서 정보 공개 취약성에 대해 검토합니다. |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
예외의 메시지, 스택 추적 또는 문자열 표현이 웹 출력에 도달합니다.
기본적으로 이 규칙은 전체 코드베이스를 분석하지만 이는 구성 가능합니다.
규칙 설명
예외 정보를 공개하면 공격자가 애플리케이션의 내부 정보를 파악할 수 있으므로 공격자가 다른 취약성을 악용할 수 있습니다.
이 규칙은 HTTP 응답으로 출력되는 예외 메시지, 스택 추적 또는 문자열 표현을 찾으려고 시도합니다.
참고 항목
이 규칙은 어셈블리 간에 데이터를 추적할 수 없습니다. 예를 들어 한 어셈블리에서 예외를 catch한 다음 예외를 출력하는 다른 어셈블리에 전달하는 경우 이 규칙은 경고를 생성하지 않습니다.
참고 항목
이 규칙이 메서드 호출 간의 데이터 흐름을 분석하는 깊이에는 구성 가능한 제한이 있습니다. EditorConfig 파일에서 제한을 구성하는 방법에 대한 자세한 내용은 분석기 구성을 참조하세요.
위반 문제를 해결하는 방법
예외 정보를 HTTP 응답에 출력하지 않습니다. 대신 일반 오류 메시지를 제공합니다. 자세한 내용은 OWASP의 부적절한 오류 처리 페이지를 참조하세요.
경고를 표시하지 않는 경우
웹 출력이 애플리케이션의 트러스트 경계 내부에 있고 외부에 노출되지 않는다는 것을 아는 경우에는 이 경고를 표시하지 않을 수 있습니다. 이러한 경우는 드뭅니다. 애플리케이션의 트러스트 경계 및 데이터 흐름이 시간이 지남에 따라 달라질 수 있다는 점을 고려해야 합니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#pragma warning disable CA3004
// The code that's violating the rule is on this line.
#pragma warning restore CA3004
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none
으로 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA3004.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
분석할 코드 구성
다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.
이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주(보안)의 모든 규칙에 대해 이러한 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.
특정 기호 제외
분석에서 형식 및 메서드와 같은 특정 기호를 제외할 수 있습니다. 예를 들어 MyType
이라는 형식 내 코드에서 규칙을 실행하지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
옵션 값의 허용되는 기호 이름 형식(|
로 구분):
- 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
- 기호의 설명서 ID 형식에 있는 정규화된 이름. 각 기호 이름에는 메서드의 경우
M:
, 형식의 경우T:
, 네임스페이스의 경우N:
과 같은 기호 종류 접두사가 필요합니다. - 생성자의 경우
.ctor
이고 정적 생성자의 경우.cctor
입니다.
예:
옵션 값 | 요약 |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
MyType 이라는 모든 기호와 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
MyType1 또는 MyType2 라는 모든 기호와 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
특정 메서드 MyMethod 를 지정된 정규화된 시그니처와 비교합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
특정 메서드 MyMethod1 및 MyMethod2 를 개별 정규화된 시그니처와 비교합니다. |
특정 형식 및 해당 파생 형식 제외
분석에서 특정 형식과 해당 파생 형식을 제외할 수 있습니다. 예를 들어 MyType
이라는 형식 및 해당 파생 형식 내에 있는 메서드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
옵션 값의 허용되는 기호 이름 형식(|
로 구분):
- 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
- 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적
T:
접두사 포함)
예:
옵션 값 | 요약 |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
MyType 이라는 모든 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
MyType1 또는 MyType2 라는 모든 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
지정된 정규화된 이름의 특정 MyType 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
개별 정규화된 이름의 특정 MyType1 , MyType2 형식 및 모든 해당 파생 형식과 일치합니다. |
의사 코드 예제
위반
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs eventArgs)
{
try
{
object o = null;
o.ToString();
}
catch (Exception e)
{
this.Response.Write(e.ToString());
}
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Try
Dim o As Object = Nothing
o.ToString()
Catch e As Exception
Me.Response.Write(e.ToString())
End Try
End Sub
End Class
해결 방법
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs eventArgs)
{
try
{
object o = null;
o.ToString();
}
catch (Exception e)
{
this.Response.Write("An error occurred. Please try again later.");
}
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Try
Dim o As Object = Nothing
o.ToString()
Catch e As Exception
Me.Response.Write("An error occurred. Please try again later.")
End Try
End Sub
End Class
.NET