Protección Automatizada de Parámetros en ASP.NET Core mediante DataProtection

Introducción a la Protección de Parámetros

En el desarrollo de APIs con ASP.NET Core, exponer identificadores numéricos secuenciales en las URL puede facilitar ataques de enumeración de recursos y simplificar el web scraping. Para mitigar esto, podemos extender el sistema nativo IDataProtector de ASP.NET Core para cifrar y descifrar automáticamente ciertos parámetros de entrada y salida, ofuscando los identificadores reales sin alterar la lógica de negocio subyacente.

Configuración del Middleware de Protección

Para implementar esta funcionalidad, podemos utilizar extensiones de protección de datos que interceptan el pipeline de MVC. A continuación, se muestra cómo registrar y configurar el servicio en el contanedor de dependencias, especificando qué propiedades deben ser ofuscadas.

builder.Services.AddDataProtection()
    .AddParameterObfuscation(config =>
    {
        config.TargetProperties = new[] { "userId", "orderId" };
        config.TokenLifespanMinutes = 15; // Expiración para dificultar el scraping
        config.BypassRawValues = false;
    });

Implementación en el Controlador y Respuestas

Una vez configurado, el controlador no requiere modificaciones estructurales. Simplemente devolvemos los modelos con sus identificadores originales. El middleware se encargará de transformar los valores antes de serializar la respuesta JSON.

[HttpGet("items")]
public IActionResult GetCatalogItems()
{
    var catalog = new List<catalogitem>
    {
        new CatalogItem { UserId = 101, ProductName = "Laptop" },
        new CatalogItem { UserId = 102, ProductName = "Monitor" }
    };
    
    return Ok(catalog);
}
</catalogitem>

La respuesta HTTP resultante mostrará los identificadores cifrados:

[
  {
    "userId": "CfDJ8MvS3iyCJCJCrNda10tFrJu_HXavFbumMGxov9ly0XkFRG6O",
    "productName": "Laptop"
  },
  {
    "userId": "CfDJ8MvS3iyCJCJCrNda10tFrJv9haZxFcv9bx2V3ZUKAMxGVD5aQzdz",
    "productName": "Monitor"
  }
]

Si un cliente intenta acceder a un recurso utilizando un identificador numérico crudo (por ejemplo, /api/items/101) y la opción BypassRawValues está desactivada, el servidor rechazará la petición. Por defecto, esto devuelve un código de estado HTTP 412 (Precondition Failed) o 400 (Bad Request), forzando al cliente a utilizar el token ofuscado obtenido previamente.

Opciones de Configuración Avanzada

El comportamiento del protector de parámetros es altamente personalizable. A continuación, se detallan las propiedades principales que controlan el ciclo de vida y las reglas de validación de los tokens generados:

public class ParameterObfuscationOptions
{
    // Propósito de aislamiento para el proveedor de protección de datos
    public string IsolationPurpose { get; set; } = "RouteParamObfuscation";

    // Tiempo de vida del token en minutos (null para tokens perpetuos)
    public int? TokenLifespanMinutes { get; set; }

    // Interruptor maestro para activar o desactivar la ofuscación
    public bool IsEnabled { get; set; } = true;

    // Permite que la API acepte tanto tokens cifrados como valores originales
    public bool BypassRawValues { get; set; } = false;

    // Código de estado HTTP a devolver cuando el token es inválido o ha expirado
    public int RejectionStatusCode { get; set; } = StatusCodes.Status412PreconditionFailed;

    // Lista de nombres de propiedades que deben ser protegidas
    public string[] TargetProperties { get; set; } = Array.Empty<string>();
}

Ajustar el TokenLifespanMinutes es una estrategia efectiva contra bots de scraping, ya que invalida los enlaces recolectados después de un período corto. Sin embargo, debe equilibrarse con la experiencia del usuario, evitando que sesiones legítimas inactivas pierdan validez antes de completar una interacción en formularios POST o PUT.

Etiquetas: ASP.NET-Core idataprotector data-protection CSharp web-api

Publicado el 10-8 04:32