Usa esta guía para comprender las vulnerabilidades comunes de la configuración de reglas de seguridad de Firebase, revisar y mejorar la seguridad de tus reglas, y probar los cambios que realices antes de implementarlos.
Si recibes una alerta que indica que tus datos no están protegidos adecuadamente, revisa estos errores comunes y actualiza las reglas vulnerables.
Accede a tus reglas de seguridad de Firebase
Para ver tus reglas existentes, usa Firebase CLI o Firebase console. Asegúrate de editar tus reglas con el mismo método, de manera consistente, para evitar reemplazar las actualizaciones por error. Si no estás seguro de si tus reglas definidas de forma local reflejan las actualizaciones más recientes, Firebase console siempre muestra la versión implementada más recientemente de tus reglas de seguridad de Firebase.
Para acceder a tus reglas desde Firebase console, selecciona tu proyecto y, luego, navega a Realtime Database, Cloud Firestore o Storage. Haz clic en Reglas una vez que estés en la base de datos o el bucket de almacenamiento correcto.
Para acceder a tus reglas desde Firebase CLI, dirígete al archivo de reglas anotado en el archivo firebase.json.
Comprende las reglas de seguridad de Firebase
Las reglas de seguridad de Firebase permiten proteger tus datos contra usuarios maliciosos. Cuando creas una instancia de base de datos o un bucket de Cloud Storage en Firebase console, puedes denegar el acceso a todos los usuarios (Modo bloqueado), o bien otorgarles acceso a todos (Modo de prueba). Aunque se recomienda que tengas una configuración más abierta durante el desarrollo, tómate el tiempo para configurar correctamente las reglas y proteger los datos antes de implementar tu app.
Usa uno de los emuladores locales de Firebase para ejecutar tu app en un entorno de desarrollo local a medida que la desarrollas y pruebas diferentes configuraciones en tus reglas.
Situaciones comunes con reglas inseguras
Debes revisar y actualizar las reglas que configuraste de forma predeterminada o mientras trabajaste en el desarrollo de tu app antes de implementarla. Evita los siguientes errores comunes para asegúrate de proteger los datos de los usuarios.
Acceso abierto
Durante la configuración de tu proyecto de Firebase, es posible que hayas establecido reglas para permitir el acceso abierto durante el desarrollo. Tal vez creas que eres el único usuario de tu app, pero, si la implementaste, ya está disponible en Internet. Si no autenticas a los usuarios ni configuras las reglas de seguridad, cualquier persona que adivine el ID del proyecto podrá robar, modificar o borrar los datos.
No se recomienda: Otorgar acceso de lectura y escritura para todos los usuarios.Cloud Firestore// Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } Realtime Database{ // Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. "rules": { ".read": true, ".write": true } } Cloud Storage// Anyone can read or write to the bucket, even non-users of your app. // Because it is shared with App Engine, this will also make // files uploaded via App Engine public. // Warning: This rule makes every file in your Cloud Storage bucket accessible to any user. // Apply caution before using it in production, since it means anyone // can overwrite all your files. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write; } } } |
Solución: Configurar reglas que restrinjan el acceso de lectura y escritura
Define reglas que tengan sentido en tu jerarquía de datos. Una de las soluciones comunes a este problema es la seguridad basada en los usuarios con Firebase Authentication. Obtén más información sobre cómo autenticar usuarios mediante reglas. Cloud FirestoreRealtime DatabaseCloud Storage |
Acceso para cualquier usuario autenticado
En ocasiones, las reglas verifican que el usuario acceda a su cuenta, pero no restringen el acceso según esa autenticación. Si una de las reglas incluye auth != null
, confirma que quieres que cualquier usuario autenticado tenga acceso a los datos.
Qué debes evitar: Permitir que cualquier usuario autenticado tenga acceso de lectura y escritura a toda tu base de datosCloud Firestoreservice cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth.uid != null; } } } Realtime Database{ "rules": { ".read": "auth.uid !== null", ".write": "auth.uid !== null" } } Cloud Storage// Only authenticated users can read or write to the bucket service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } } |
Solución: Limitar el acceso mediante condiciones de seguridad
Cuando verifiques la autenticación, te recomendamos usar una de las propiedades de autenticación para restringir aún más el acceso de algunos usuarios a conjuntos de datos específicos. Obtén más información sobre las diferentes propiedades de autenticación. Cloud FirestoreRealtime DatabaseCloud Storage |
Reglas heredadas de forma inadecuada (Realtime Database)
Las reglas de seguridad de Realtime Database se transmiten en cascada, y las reglas en rutas de acceso superiores y más superficiales anulan las de los nodos secundarios más profundos. Cuando escribes una regla en un nodo secundario, recuerda que solo puede otorgar privilegios adicionales. No puedes definir mejor o revocar el acceso a los datos en una ruta de acceso más profunda en la base de datos.
No se recomienda: Definir mejor las reglas en rutas de acceso secundarias
{ "rules": { "foo": { // allows read to /foo/* ".read": "data.child('baz').val() === true", "bar": { /* ignored, since read was allowed already */ ".read": false } } } } |
Solución: Escribe reglas en rutas de acceso superiores que sean amplias y otorga privilegios más específicos en rutas de acceso secundarias. Si las necesidades de acceso a tus datos requieren un mayor nivel de detalle, aplícalo en tus reglas. Obtén más información acerca de la aplicación en cascada de las reglas de seguridad de Realtime Database en el artículo sobre cómo proteger tus datos. |
Acceso cerrado
Otro enfoque común que puedes aplicar mientras desarrollas la app es mantener los datos bloqueados. Por lo general, esto significa que bloqueaste el acceso de lectura y escritura para todos los usuarios de la siguiente manera:
Cloud Firestore
// Deny read/write access to all users under any conditions service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
Realtime Database
{ "rules": { ".read": false, ".write": false } }
Cloud Storage
// Access to files through Cloud Storage is completely disallowed. // Files may still be accessible through App Engine or Google Cloud Storage APIs. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if false; } } }
Los SDK de Firebase Admin y Cloud Functions aún podrán acceder a tu base de datos. Usa estas reglas cuando quieras usar Cloud Firestore o Realtime Database como un backend solo de servidor junto con el SDK de Firebase Admin. Aunque esta alternativa es segura, recomendamos que pruebes que los clientes de tu app puedan recuperar datos sin problemas.
Consulta cómo comenzar a usar las reglas de seguridad de Cloud Firestore para obtener más información sobre estas reglas y su funcionamiento.
Prueba tus reglas de seguridad de Cloud Firestore
Usa el emulador de Firebase para verificar el comportamiento de tu app y la configuración de las reglas de seguridad de Cloud Firestore. Úsalo para ejecutar y automatizar las pruebas de unidades en un entorno local antes de implementar las modificaciones.
Para validar rápidamente las reglas de seguridad de Firebase en Firebase console, usa el simulador de reglas de Firebase.