¿Qué hace convex-security-audit?
Patrones de revisión de seguridad profunda para lógica de autorización, límites de acceso a datos, aislamiento de acciones, limitación de velocidad y protección de operaciones sensibles.
Descripción
Esta habilidad proporciona un conjunto de patrones y guías para realizar auditorías de seguridad en aplicaciones construidas con Convex. Cubre áreas clave como la verificación de autorización, la definición de límites en el acceso a datos, el aislamiento de acciones para prevenir efectos secundarios no deseados, la implementación de limitación de velocidad para evitar abusos y la protección de operaciones que manejan información sensible.
Uso
Para utilizar esta habilidad, los desarrolladores deben integrar los patrones de revisión en su flujo de trabajo de desarrollo. Se recomienda ejecutar las auditorías antes de cada despliegue para garantizar que las medidas de seguridad estén actualizadas y sean efectivas.
Patrones de Revisión
Autorización
- Verificar que todas las funciones de mutación tengan comprobaciones de autorización adecuadas.
- Asegurarse de que los roles de usuario se validen correctamente antes de permitir operaciones.
Límites de Acceso a Datos
- Revisar que las consultas a la base de datos filtren los resultados según el contexto del usuario.
- Evitar la exposición de campos sensibles en respuestas de API.
Aislamiento de Acciones
- Confirmar que las acciones no tengan efectos secundarios no controlados.
- Utilizar transacciones para garantizar la consistencia de los datos.
Limitación de Velocidad
- Implementar mecanismos de limitación de velocidad en endpoints críticos.
- Monitorear el uso de recursos para detectar posibles ataques de denegación de servicio.
Protección de Operaciones Sensibles
- Encriptar datos sensibles en reposo y en tránsito.
- Utilizar autenticación multifactor para operaciones de alto riesgo.
Ejemplos
// Ejemplo de verificación de autorización en una mutación de Convex
import { mutation } from "./_generated/server";
import { v } from "convex/values";
export const updateUser = mutation({
args: { userId: v.id("users"), name: v.string() },
handler: async (ctx, args) => {
const identity = await ctx.auth.getUserIdentity();
if (!identity) {
throw new Error("Unauthenticated");
}
// Verificar que el usuario autenticado sea el mismo que se actualiza
if (identity.subject !== args.userId) {
throw new Error("Unauthorized");
}
// Realizar la actualización
await ctx.db.patch(args.userId, { name: args.name });
},
});
Referencias
- Documentación oficial de Convex: https://docs.convex.dev/
- Guía de seguridad de Convex: https://docs.convex.dev/security