Corrigir regras inseguras

Use este guia para entender as vulnerabilidades comuns nas configurações do Cloud Firestore Security Rules, revisar e proteger melhor suas próprias regras e testar as alterações antes de implantá-las.

Se você receber um alerta de que seu banco de dados do Cloud Firestore não está protegido corretamente, é possível resolver as vulnerabilidades modificando e testando as Cloud Firestore Security Rules.

Para ver suas regras de segurança atuais, acesse a guia "Regras" no console do Firebase.

Noções básicas sobre as Cloud Firestore Security Rules

As Cloud Firestore Security Rules protegem seus dados contra usuários mal-intencionados. As regras padrão de qualquer instância do Cloud Firestore criada no console do Firebase negam acesso a todos os usuários. Para desenvolver seu aplicativo e acessar o banco de dados, será necessário modificar essas regras e conceder acesso geral a todos os usuários em um ambiente de desenvolvimento. Antes de implantar o aplicativo em um ambiente de produção, reserve tempo para configurar corretamente suas regras e proteger seus dados.

Enquanto desenvolve seu app e testa diferentes configurações para suas regras, use o emulador do Cloud Firestore para executar o app em um ambiente de desenvolvimento local.

Cenários comuns com regras não seguras

As Cloud Firestore Security Rules configuradas por padrão ou durante o desenvolvimento inicial do app com o Cloud Firestore precisam ser revisadas e atualizadas antes da implantação. Proteja corretamente os dados dos usuários, evitando as armadilhas comuns a seguir.

Acesso aberto

Ao configurar o Cloud Firestore, é possível ter definido suas regras para permitir o acesso aberto durante o desenvolvimento. Talvez você acredite que é a única pessoa que usa o aplicativo. No entanto, se você o implantou, ele está disponível na Internet. Se você não estiver autenticando usuários e configurando regras de segurança, qualquer pessoa que adivinhar seu código de projeto pode roubar, modificar ou excluir os dados.

Não recomendado: acesso de leitura e gravação a todos os usuários.
// 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;
    }
  }
}
Solução: regras que restringem o acesso de leitura e gravação.

Desenvolva regras que façam sentido para sua hierarquia de dados. Uma das soluções comuns para essa falha é a segurança baseada no usuário com o Firebase Authentication. Saiba mais sobre como autenticar usuários usando as regras.

Apenas o proprietário do conteúdo

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;

    }
  }
}
  

Acesso público e privado misto

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;
    }
  }
}
  

Acesso para qualquer usuário autenticado

Às vezes, as Cloud Firestore Security Rules verificam se um usuário está conectado, mas não restringem o acesso com base nessa autenticação. Se uma de suas regras incluir auth != null, confirme se você quer que qualquer usuário que fez login tenha acesso aos dados.

Não recomendável: qualquer usuário conectado tem acesso de leitura e gravação a todo o banco de dados.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Solução: restrinja o acesso usando as condições de segurança.

Se você fizer a verificação de autenticação, talvez também seja interessante usar uma dessas propriedades para restringir ainda mais o acesso de determinados usuários a conjuntos de dados específicos. Saiba mais sobre como adicionar condições de segurança e acesso baseado em papéis.

Acesso baseado na função

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.
    }
  }
}

Acesso com base em 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;
    }
  }
}
  

Acesso público e privado misto

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
    }
  }
}
  

Acesso fechado

Ao desenvolver seu aplicativo, outra abordagem comum é manter seus dados bloqueados. Normalmente, isso significa bloquear o acesso de leitura e gravação a todos os usuários da seguinte maneira:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Os SDKs Admin do Firebase e o Cloud Functions ainda podem acessar seu banco de dados. Use essas regras quando você quiser usar o Cloud Firestore como um back-end somente para servidores junto com o SDK Admin do Firebase. Embora seja seguro, é necessário testar se os clientes do seu aplicativo podem recuperar dados adequadamente.

Saiba mais sobre as Cloud Firestore Security Rules e como elas funcionam em Primeiras etapas com as Cloud Firestore Security Rules.

Verifique seu Cloud Firestore Security Rules

Para verificar o comportamento do app e as configurações das Cloud Firestore Security Rules, use o emulador do Cloud Firestore. Utilize o emulador do Cloud Firestore para executar e automatizar testes de unidade em um ambiente local antes de implantar as alterações.

Para testar rapidamente as Cloud Firestore Security Rules atualizadas no console do Firebase, use a ferramenta Playground de regras.

  1. Para abrir o Playground de regras, clique em Playground de regras na guia Regras.
  2. Nas configurações do Playground de regras, selecione as opções para seu teste, incluindo:
    • gravações ou leituras de teste
    • um local específico no seu banco de dados, como um caminho
    • o tipo de autenticação: usuário anônimo autenticado, não autenticado ou um código de usuário específico
    • dados específicos do documento que suas regras mencionam especificamente (por exemplo, se as regras exigem a presença de um campo específico antes de permitir uma gravação)
  3. Clique em Executar e procure os resultados no banner acima da janela de regras.