Usa esta guía para comprender las vulnerabilidades comunes en los parámetros de configuración de Firebase Security Rules, revisar y proteger mejor tus propias reglas, y probar los cambios 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 tu Firebase Security Rules
Para ver tu Rules existente, usa la CLI de Firebase o la consola de Firebase. 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, la consola de Firebase siempre muestra la versión implementada más recientemente de tus reglas de seguridad de Firebase Security Rules.
Para acceder a tus reglas desde la consola de Firebase, 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 la CLI de Firebase CLI, dirígete al archivo de reglas anotado en el archivo firebase.json.
Comprende Firebase Security Rules
Firebase Security Rules protege tus datos de usuarios maliciosos. Cuando creas una instancia de base de datos o un bucket de Cloud Storage en la consola de Firebase, puedes elegir si quieres denegar el acceso a todos los usuarios (Modo bloqueado) o 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 Rules 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 using 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, 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 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 |
(Realtime Database) Reglas heredadas de forma inadecuada
Realtime Database Security Rules en cascada, con reglas en rutas de acceso superiores y más superficiales que 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: Escribir reglas en rutas de acceso superiores que sean amplias y otorgar 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 sobre la aplicación en cascada de Realtime Database Security Rules en la sintaxis básica de Realtime Database Security Rules. |
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 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.
Prueba tu implementación de Cloud Firestore Security Rules
Para verificar el comportamiento de tu app y la configuración de Cloud Firestore Security Rules, usa el emulador de Firebase. Usa el emulador de Cloud Firestore para ejecutar y automatizar las pruebas de unidades en un entorno local antes de implementar las modificaciones.
Para validar rápidamente Firebase Security Rules en la consola de Firebase, usa el simulador de reglas de Firebase.