다음을 통해 공유


CA2361: DataSet.ReadXml()을 포함하는 자동 생성된 클래스가 신뢰할 수 없는 데이터와 함께 사용되지 않도록 하기

속성
규칙 ID CA2361
제목 DataSet.ReadXml()을 포함하는 자동 생성된 클래스가 신뢰할 수 없는 데이터와 함께 사용되지 않도록 하기
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요

원인

DataSet.ReadXml 메서드가 호출되었거나 참조되었으며 자동 생성된 코드 내에 있습니다.

이 규칙은 자동으로 생성되는 코드 b를 분류합니다.

CA2351은 자동으로 생성되지 않는 코드 내에서 DataSet.ReadXml이 표시될 때 발생하는 유사한 규칙입니다.

규칙 설명

신뢰할 수 없는 입력으로 DataSet을 역직렬화하면 공격자는 악의적인 입력을 만들어 서비스 거부 공격을 수행할 수 있습니다. 알 수 없는 원격 코드 실행 취약성이 있을 수 있습니다.

이 규칙은 CA2351과 비슷하지만 GUI 애플리케이션 내에서 데이터의 메모리 내 표현을 위한 자동 생성 코드용입니다. 일반적으로 이러한 자동 생성 클래스는 신뢰할 수 없는 입력에서 역직렬화되지 않습니다. 애플리케이션은 다양한 방식으로 사용될 수 있습니다.

자세한 내용은 DataSet 및 DataTable 보안 지침을 참조하세요.

위반 문제를 해결하는 방법

  • 가능하면 대신 DataSet를 사용합니다.
  • 직렬화된 데이터를 변조 방지로 설정합니다. serialization 후에 직렬화된 데이터에 암호화된 방식으로 서명합니다. deserialization 전에 암호화 시그니처의 유효성을 검사합니다. 암호화 키가 공개되지 않도록 보호하고 키 순환을 설계합니다.

경고를 표시하지 않는 경우

다음 경우에는 이 규칙의 경고를 표시하지 않아도 됩니다.

  • 입력을 신뢰할 수 있습니다. 애플리케이션의 트러스트 경계 및 데이터 흐름이 시간이 지남에 따라 달라질 수 있다는 점을 고려합니다.
  • 위반 문제를 해결하는 방법의 예방 조치 중 하나를 수행했습니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA2361
// The code that's violating the rule is on this line.
#pragma warning restore CA2361

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 none에서 심각도를 으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2361.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

의사 코드 예제

위반

namespace ExampleNamespace
{
    /// <summary>
    ///Represents a strongly typed in-memory cache of data.
    ///</summary>
    [global::System.Serializable()]
    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
    [global::System.ComponentModel.ToolboxItem(true)]
    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
    [global::System.Xml.Serialization.XmlRootAttribute("Package")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
    public partial class Something : global::System.Data.DataSet {

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
                this.Reset();
                global::System.Data.DataSet ds = new global::System.Data.DataSet();
                ds.ReadXml(reader);
                if ((ds.Tables["Something"] != null)) {
                    base.Tables.Add(new SomethingTable(ds.Tables["Something"]));
                }
                this.DataSetName = ds.DataSetName;
                this.Prefix = ds.Prefix;
                this.Namespace = ds.Namespace;
                this.Locale = ds.Locale;
                this.CaseSensitive = ds.CaseSensitive;
                this.EnforceConstraints = ds.EnforceConstraints;
                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
                this.InitVars();
            }
            else {
                this.ReadXml(reader);
                this.InitVars();
            }
        }
    }
}

CA2350: DataTable.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다.

CA2351: DataSet.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다.

CA2352: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음

CA2353: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable

CA2354: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있습니다.

CA2355: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable

CA2356: 웹 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable

CA2362: 자동 생성된 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음