Usa esta guía para comprender las vulnerabilidades comunes en los parámetros de configuración de Cloud Firestore Security Rules, revisar y proteger mejor tus propias reglas, y probar los cambios antes de implementarlos.
Si recibes una alerta que indica que tu base de datos de Cloud Firestore no está protegida correctamente, puedes resolver las vulnerabilidades modificando y probando tus Cloud Firestore Security Rules.
Ve a la pestaña Reglas en la consola de Firebase para ver las reglas de seguridad existentes.
Comprende tu Cloud Firestore Security Rules
Cloud Firestore Security Rules protege tus datos de usuarios maliciosos. Las reglas predeterminadas para cualquier instancia de Cloud Firestore creada en la consola de Firebase deniega el acceso a todos los usuarios. Para desarrollar tu app y acceder a la base de datos, debes modificar esas reglas y, si es necesario, otorgarles acceso general a todos los usuarios del entorno de programación. Sin embargo, antes de implementar la app en un entorno de producción, debes proteger tus datos y configurar las reglas de manera adecuada.
Mientras desarrollas la app y pruebas diferentes opciones de configuración para las reglas, usa el emulador de Cloud Firestore a fin de ejecutar la app en un entorno de desarrollo local.
Situaciones comunes con reglas inseguras
Debes revisar y actualizar las Cloud Firestore Security Rules que configuraste de forma predeterminada o mientras trabajaste en el desarrollo de tu app con Cloud Firestore antes de implementarla. Evita los siguientes errores comunes para asegúrate de proteger los datos de los usuarios.
Acceso abierto
Cuando configuraste Cloud Firestore, 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, está disponible en Internet. Si no autenticas a los usuarios ni configuras reglas de seguridad, cualquier persona que adivine el ID del proyecto podrá robar, modificar o borrar los datos.
Qué debes evitar: Otorgar acceso de lectura y escritura a todos los usuarios. |
// Allow read/write access to all users under any conditions // Warning: **NEVER** use this rule set in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
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. |
Solo para el propietario del contenido
service cloud.firestore { match /databases/{database}/documents { // Allow only authenticated content owners access match /some_collection/{document} { // Allow reads and deletion if the current user owns the existing document allow read, delete: if request.auth.uid == resource.data.author_uid; // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; } } }
Acceso público y privado mixto
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { // Allow public reads allow read: if true // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; // Allow deletion if the current user owns the existing document allow delete: if request.auth.uid == resource.data.author_uid; } } }
Acceso para cualquier usuario autenticado
En ocasiones, Cloud Firestore Security Rules 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 datos |
service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { 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 cómo agregar condiciones de seguridad y el acceso según la función. |
Acceso según la función
service cloud.firestore { match /databases/{database}/documents { // Assign roles to all users and refine access based on user roles match /some_collection/{document} { allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader" allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer" // Note: Checking for roles in your database using `get` (as in the code // above) or `exists` carry standard charges for read operations. } } }
Acceso según los atributos
// Give each user in your database a particular attribute // and set it to true/false // Then, use that attribute to grant access to subsets of data // For example, an "admin" attribute set // to "true" grants write access to data service cloud.firestore { match /databases/{database}/documents { match /collection/{document} { allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; allow read: true; } } }
Acceso público y privado mixto
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { allow read: if true allow write: if request.auth.uid == request.resource.data.author_uid } } }
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:
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
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 como 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.
Obtén más información sobre Cloud Firestore Security Rules y cómo funcionan en Comienza a usar Cloud Firestore Security Rules.
Revisa tu Cloud Firestore Security Rules
Para comprobar el comportamiento de tu app y la configuración de Cloud Firestore Security Rules, usa el emulador de Cloud Firestore. Usa el emulador de Cloud Firestore para ejecutar y automatizar las pruebas de unidades en un entorno local antes de implementar las modificaciones.
Para probar rápidamente tus Cloud Firestore Security Rules actualizadas en Firebase console, usa la herramienta de zona de pruebas de reglas.
- Para abrir esta herramienta, haz clic en Zona de pruebas de reglas, en la pestaña Reglas.
- En la configuración de la Zona de pruebas de reglas, selecciona opciones para la prueba, como las siguientes:
- Prueba de lectura o escritura
- Una ubicación específica en la base de datos, como una ruta de acceso
- Tipo de autenticación: ID de usuario específico, usuario anónimo autenticado o no autenticado
- Datos del documento al que hacen referencia tus reglas de manera específica (por ejemplo, si las reglas requieren la presencia de un campo determinado antes de permitir una operación de escritura)
- Haz clic en Ejecutar y busca los resultados en el banner que está arriba de la ventana de reglas.