Impacto
No implementar la seguridad de nivel de fila (RLS) permite a atacantes no autenticados consultar datos de una base de datos Supabase cuando las tablas públicas se exponen a través del límite anónimo [S1]. Debido a que las aplicaciones Next.js generalmente exponen la clave Supabase anon en el código del lado del cliente, un atacante puede usar esta clave para realizar llamadas REST API directas a la base de datos, omitiendo la lógica de la aplicación prevista y accediendo a información confidencial del usuario [S2].
Causa raíz
De forma predeterminada, las tablas de Postgres en Supabase requieren la activación explícita de la seguridad de nivel de fila para evitar el acceso público [S1]. Cuando un desarrollador crea una tabla pero olvida habilitar RLS o no define políticas restrictivas, la base de datos puede exponer datos a cualquiera que posea la clave anon [S1] del proyecto. En las aplicaciones Next.js, la representación del lado del servidor y la recuperación del lado del cliente también requieren una configuración cuidadosa del cliente para que el contexto del usuario autenticado llegue a la capa de la base de datos [S2].
Arreglos concretos
- Habilite RLS: Ejecute
ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY;para cada tabla pública que almacene datos de aplicaciones [S1]. - Definir políticas: Cree políticas específicas que restrinjan el acceso según el estado de autenticación del usuario, como
CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id);[S1]. - Clientes seguros del lado del servidor: Cuando utilice Next.js, mantenga los clientes con función de servicio solo en el servidor y siga aplicando filtros de propiedad antes de devolver datos a los usuarios [S2].
Cómo lo prueba FixVibe
FixVibe ya ejecuta una verificación de solo lectura Supabase RLS a través de baas.supabase-rls. El escáner descubre la URL del proyecto Supabase y la clave pública anónima de paquetes de JavaScript del mismo origen, solicita a PostgREST metadatos de la tabla pública e intenta realizar selecciones limitadas de solo lectura para confirmar si los datos están expuestos sin una sesión de usuario. No inserta, actualiza, elimina ni utiliza credenciales de función de servicio. Los análisis de repositorio también pueden detectar esto antes a través de repo.supabase.missing-rls, que marca las migraciones de SQL que crean tablas públicas sin ENABLE ROW LEVEL SECURITY.
