APIs y solicitudes
Ataques que abusan de la forma de una solicitud o de la confianza que el navegador deposita en tu sitio. Son fáciles de pasar por alto porque el cliente normal nunca los envía.
Lista de verificación
- Protege las solicitudes que cambian estado contra CSRF. Si autenticas con cookies, cada endpoint que cambie estado necesita un token CSRF o una política estricta de cookies SameSite. Si autenticas con un bearer token en un encabezado Authorization (no con una cookie ambiental), el CSRF clásico no aplica, y esa es una razón para preferirlo.
- Cierra el login-CSRF. Incluso el flujo de inicio de sesión puede falsificarse: vincula el
statede OAuth al navegador con una cookie establecida al inicio y comprobada en el callback. Consulta autenticación. - Asegura CORS. Nunca reflejes un
Originarbitrario y nunca envíesAccess-Control-Allow-Origin: *con credenciales. Usa una lista explícita de orígenes permitidos, y solo los métodos y encabezados que necesites. Un "permitir todo" por defecto es un error común de plantilla. - Impide la asignación masiva. No vuelques el cuerpo de una solicitud directamente en una actualización de base de datos. Acepta una lista explícita de campos escribibles, para que un usuario no pueda enviar
{"role":"admin"}o{"plan":"enterprise"}y escalar privilegios. Marca los campos de solo lectura e ignora los desconocidos. - Concede privilegios y estado de pago solo desde un evento de confianza. Un plan o un saldo de créditos debe cambiar desde un webhook de pago verificado o una acción de administrador, nunca desde un valor de una solicitud del usuario.
- Verifica los webhooks. Comprueba la firma del proveedor sobre el cuerpo sin procesar, confirma que el importe y la moneda coinciden con lo esperado, y haz que cada evento sea idempotente para que una repetición no se aplique dos veces.
- Valida los tipos de contenido y los tamaños. Rechaza los tipos de contenido inesperados y limita el tamaño del cuerpo antes de analizarlo.
Cómo probar
- Añade
role,is_admin,planocreditsa una solicitud de actualización y confirma que el servidor los ignora. - Envía una solicitud de origen cruzado y confirma que CORS no refleja tu origen.
- Repite un webhook dos veces y confirma que se aplica una sola vez.