Compartir a través de


CA2361: Asegurarse de que la clase autogenerada que contiene DataSet.ReadXml() no se utilice con datos que no son de confianza

Propiedad Value
Identificador de la regla CA2361
Título Asegurarse de que la clase autogenerada que contiene DataSet.ReadXml() no se utilice con datos que no son de confianza
Categoría Seguridad
La corrección interrumpe o no interrumpe Poco problemático
Habilitado de forma predeterminada en .NET 9 No

Causa

Se llamó o se hizo referencia al método DataSet.ReadXml, y no dentro del código generado automáticamente.

Esta regla clasifica el código b generado automáticamente:

CA2351 es una regla similar, para cuando DataSet.ReadXml aparece dentro del código generado automáticamente.

Descripción de la regla

Al deserializar un DataSet con una entrada que no es de confianza, un atacante puede crear una entrada malintencionada para realizar un ataque por denegación de servicio. Puede haber vulnerabilidades de ejecución de código remoto desconocidas.

Esta regla es como CA2351, pero para el código generado automáticamente para una representación en memoria de los datos dentro de una aplicación GUI. Normalmente, estas clases autogeneradas no se deserializan de la entrada que no es de confianza. Su uso de la aplicación puede variar.

Para obtener más información, vea Guía de seguridad de DataSet y DataTable.

Cómo corregir infracciones

  • Si es posible, use Entity Framework en lugar de DataSet.
  • Proteja los datos serializados contra alteraciones. Después de la serialización, firme criptográficamente los datos serializados. Antes de la deserialización, valide la firma criptográfica. Proteja la clave criptográfica para que no se revele y diseñe las rotaciones de clave.

Cuándo suprimir las advertencias

Se puede suprimir una advertencia de esta regla si:

  • Sabe que la entrada es de confianza. Considera que el límite de confianza de la aplicación y los flujos de datos pueden cambiar con el tiempo.
  • Ha tomado una de las precauciones indicadas en Cómo corregir infracciones.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplos de pseudocódigo

Infracción

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: Asegurarse de que la entrada de DataTable.ReadXml() sea de confianza

CA2351: Asegúrese de que la entrada de DataSet.ReadXml() sea de confianza

CA2352: Un objeto DataSet o DataTable no seguro en un tipo serializable puede ser vulnerable a ataques de ejecución de código remoto

CA2353: Objeto DataSet o DataTable no seguro en un tipo serializable

CA2354: Un objeto DataSet o DataTable no seguro en un gráfico de objetos deserializado puede ser vulnerable a ataques de ejecución de código remoto

CA2355: Objeto DataSet o DataTable no seguro en un gráfico de objetos deserializado

CA2356: Unsafe DataSet or DataTable in web deserialized object graph (DataTable o DataSet no seguro en un gráfico de objetos deserializado web)

CA2362: Un elemento DataSet o DataTable no seguro en un tipo serializable autogenerado puede ser vulnerable a ataques de ejecución remota de código