7.1.9 Recomendaciones de seguridad y rendimiento a tomar en cuenta con OData

Debido a que con OData prácticamente permites el acceso a tus tablas debes tomar en cuenta algunas consideraciones de seguridad y rendimiento.

Si deseas restringir la información puedes utilizar lo siguiente:

Ocultar ciertos campos

Si deseas que un campo no este disponible, para los select, puedes agregar el atributo [IgnoreDataMember] arriba de la propiedad que deseas ocultar.

Ejemplo: Si nuestro modelo Producto agregamos un campo Precio que deseamos que no este visible solo agrega el atributo [IgnoreDataMember]

public class Producto
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //Otros campos 
    
    [IgnoreDataMember]
    public decimal Precio { get; set; }
} 

Limitar el número de registros

Si una tabla cuenta con miles de registros se recomienda no regresar toda la información en una sola petición, sino irla regresando en partes. Puedes agregar el número máximo de registros que regresará el servicio agregando el PageSize en el atributo EnableQuery

[EnableQuery(PageSize = 10)]
public IActionResult Get()
{
    var clientes = _context.Cliente;
    return Ok(clientes);
}

De esta forma si desean obtener mas de 10 registros, solo se regresan los primeros 10 registros.

http://localhost:5000/odata/Clientes?$top=15

El servicio solo regresará los primeros 10 clientes.

Limitar Opciones de Consulta

Debes tomar en cuenta que los usuarios pueden realizar consultas por cualquier campo, por lo cual si una tabla tiene muchos registros, se pueden realizar filtros por campos que no tengan índices lo cual tendría ocupado tu servidor. Una de las opciones es no permitir que se hagan filtros u ordenamientos.

Puedes agregar las opciones que deseas permitir en tu servicio en el atributo Queryable mediante | puedes ir agregando las opciones que permites en tu servicio.

En este ejemplo solo permites que se use el método Skip y el Top

ClientesController.cs
using Microsoft.AspNet.OData.Query;

[EnableQuery(PageSize = 10,
             AllowedQueryOptions =  AllowedQueryOptions.Skip |
                                    AllowedQueryOptions.Top |
                                    AllowedQueryOptions.Count|
                                    AllowedQueryOptions.Select |
                                   AllowedQueryOptions.Expand)]       
public IActionResult Get()

Limitar los campos para ordenar

Otra recomendación es que si permites la opción de ordenar permitas ordenar de preferencia por los campos por los cuales tienes un índice, de esta forma se utilizará el índice y la información se regresa de forma mas rápida. Agrega lo siguiente:

Agrega la opción AllowedOrderByProperties y entre paréntesis agrega los campos por los cuales si deseas permitir que ordenen los resultados.

[EnableQuery(AllowedOrderByProperties = "Id,Clave,RazonSocial")

Configuración general

También puedes configurar de forma general en el archivo startup.cs

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddControllers().AddOData(opt =>
        { 
            opt.Select().Expand().Filter()
               .OrderBy().SetMaxTop(100).Count();

Puedes consultar la guía oficial aquí

Last updated