Cómo Restringir el Acceso a Firebase Realtime Database Basado en Parámetros de Consulta Específicos
En este artículo se aborda un problema común relacionado con la seguridad en Firebase Realtime Database, específicamente cómo restringir el acceso a una lista de dominios verificados que están almacenados en formato JSON.
Problema
Se tiene un sistema de lista blanca que valida los dominios permitidos para asegurar que un tema ha sido verificado y adquirido. Actualmente, el acceso directo a la URL del JSON revela toda la lista de dominios, lo cual no es deseable. Se requiere una solución que permita mostrar solo el dominio solicitado si está en la lista y no mostrar nada si no se proporciona un dominio válido como parámetro.
Estructura de Datos JSON en Firebase
La estructura JSON conteniendo los dominios es la siguiente:
[
"www.eatingfact-tenolent.blogspot.com",
"www.prothomalo-tenolent.blogspot.com"
]
Reglas Actuales de Firebase
Las reglas actuales de acceso son:
{
"rules": {
".read": true,
".write": true
}
}
Estas reglas permiten el acceso completo de lectura y escritura, lo cual no es seguro.
Solución Propuesta
-
Revisar las reglas de seguridad: Es necesario establecer reglas de seguridad más restrictivas que limiten el acceso solo a los dominios permitidos.
- Implementar funciones de Cloud Functions para Firebase: Para lograr el comportamiento deseado, se recomienda crear una función de Cloud Function que tome un parámetro de dominio en la solicitud y verifique si está en la lista blanca. Esto permite filtrar el resultado antes de enviarlo al usuario.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.getDomain = functions.https.onRequest(async (req, res) => {
const domain = req.query.domain;
if (!domain) {
return res.status(400).send('No domain parameter provided');
}
const snapshot = await admin.database().ref('/domains').once('value');
const domains = snapshot.val();
if (domains.includes(domain)) {
return res.status(200).json(domain);
} else {
return res.status(404).send('Domain not found');
}
});
- Actualizar las reglas de la base de datos: Cambia las reglas de Firebase por defecto a algo más restrictivo. Por ejemplo, se pueden establecer reglas que permitan la lectura solo desde funciones de Cloud:
{
"rules": {
".read": "auth != null && auth.token.admin === true",
".write": "auth != null && auth.token.admin === true"
}
}
Esto permite que solo las funciones autenticadas de Firebase tengan acceso de lectura y escritura.
Conclusión
Al implementar funciones de Cloud Functions para manejar las solicitudes de dominios y al establecer reglas de seguridad restrictivas en Firebase, se puede proteger adecuadamente la lista de dominios verificados. Esta solución asegura que solo se muestre un dominio si se proporciona un parámetro válido y se minimizan los riesgos de exposición de datos sensibles.