Corrige reglas inseguras

Usa esta guía para comprender las vulnerabilidades comunes de la configuración de reglas de seguridad de Cloud Firestore, revisar y fortalecer tus reglas, y probar los cambios que realices antes de implementarlos.

Si recibes una alerta que indica que tu base de datos de Cloud Firestore no está protegida correctamente, puedes modificar y probar tus reglas de seguridad de Cloud Firestore para corregir las vulnerabilidades.

Ve a la pestaña Reglas de Firebase console para ver las reglas de seguridad existentes.

Información sobre las reglas de seguridad de Cloud Firestore

Las reglas de seguridad de Cloud Firestore permiten proteger tus datos contra usuarios malintencionados. Las reglas predeterminadas de las instancias de Cloud Firestore que se crean en Firebase console impiden 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.

Cuando desarrolles apps y pruebes distintas configuraciones de reglas, usa el emulador de Cloud Firestore para ejecutar la app en un entorno de programación local.

Situaciones comunes con reglas inseguras

Antes de implementar la app, debes revisar y actualizar las reglas de seguridad de Cloud Firestore que podrías tener configuradas de forma predeterminada o que quizás hayas establecido cuando empezaste a trabajar en el desarrollo de la app con Cloud Firestore. Asegúrate de proteger los datos de los usuarios correctamente evitando los siguientes riesgos comunes.

Acceso abierto

Durante la configuración de 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 read, write: if request.auth != null && request.auth.uid == request.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 read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Acceso para cualquier usuario autenticado

En ocasiones, las reglas de seguridad de Cloud Firestore verifican que un usuario haya accedido a su cuenta, pero no restringen el acceso según esa autenticación. Si una de tus 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 utilizar 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.

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.

Revisa tus reglas de seguridad de Cloud Firestore

Usa el emulador de Cloud Firestore para verificar el comportamiento de tu app y las configuraciones de 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 probar rápidamente la versión actualizada de las reglas de seguridad de Cloud Firestore en Firebase console, usa la herramienta Zona de pruebas de reglas.

  1. Para abrir esta herramienta, haz clic en Zona de pruebas de reglas, en la pestaña Reglas.
  2. 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)
  3. Haz clic en Ejecutar y busca los resultados en el banner que está arriba de la ventana de reglas.