44
Nunca expongas una API sin límite de peticiones por cliente
Por qué fallaSin límite, el mismo endpoint sirve para enumerar usuarios, adivinar códigos, vaciar tu base de datos con paginación y arruinarte la factura de la nube. También lo convierte en un objetivo trivial de denegación de servicio.
En su lugarLímite por identidad y por IP, con ventana deslizante y respuesta 429 con Retry-After. Límites más estrictos en login, recuperación de contraseña, envío de códigos y endpoints caros. Tope máximo de tamaño de página y de profundidad de consulta.
Cómo se detectaSe lanzan ráfagas sostenidas contra los endpoints sensibles y se mira si aparece algún 429; también se prueba si cambiar la IP o un identificador de cliente reinicia el contador.
OWASP API4:2023 · CWE-770
45
Nunca pases el cuerpo entero de la petición al ORM en una actualización
Por qué fallaSi el objeto recibido se vuelca sobre la entidad, el atacante añade campos que tú nunca pusiste en el formulario —rol, saldo, verificado, empresaId— y el ORM los guarda encantado. Se llama asignación masiva y es silenciosa.
En su lugarSelecciona explícitamente los campos actualizables por endpoint y por rol, desde un objeto validado con esquema. Nada de esparcir el cuerpo. Marca en el modelo qué atributos jamás son escribibles desde la capa HTTP.
Malawait usuarios.update({ where: { id }, data: req.body })
Bienconst { nombre, telefono } = EsquemaPerfil.parse(req.body); await usuarios.update({ where: { id }, data: { nombre, telefono } })
Cómo se detectaSe comparan los campos que devuelve el GET del recurso con los que acepta el PUT o el PATCH, y se envían los sobrantes para ver si se persisten.
OWASP API6:2023 · CWE-915
46
Nunca devuelvas la entidad completa de base de datos porque "el frontend ya filtra"
Por qué fallaEl filtrado del frontend es cosmético: la respuesta viaja entera y se lee en las herramientas de desarrollo o con curl. Así se filtran hashes de contraseña, correos, teléfonos, notas internas y campos de otros módulos.
En su lugarDefine un objeto de salida explícito por endpoint con los campos que de verdad se publican, y adapta ese conjunto al rol de quien pregunta. Marca el esquema de respuesta en la API para que lo no declarado no salga.
Cómo se detectaSe comparan las respuestas crudas con lo que muestra la interfaz, buscando campos de más; se revisan también las respuestas de listados y de búsqueda, que suelen ser las más generosas.
OWASP API3:2023 · CWE-213
47
Nunca aceptes un cuerpo de petición sin validar esquema, tipos y tamaño máximo
Por qué fallaSin validación entra cualquier cosa: tipos inesperados que rompen la lógica, cadenas gigantes que agotan la memoria, objetos anidados que bloquean el bucle de eventos y campos extra que acaban en la base de datos.
En su lugarValida en el borde con un esquema estricto (zod o el JSON Schema de Fastify): tipos, formatos, longitudes, rangos, enumeraciones y rechazo de propiedades desconocidas. Fija un límite de tamaño de cuerpo y de profundidad, y valida también rutas, query y cabeceras.
Cómo se detectaSe hace fuzzing con tipos cambiados, valores límite, cadenas enormes, anidamiento profundo y arrays gigantes, y se buscan 500, tiempos de respuesta disparados o datos corruptos.
OWASP API8:2023 · CWE-20