Corrigir regras inseguras

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

Se você receber um alerta de que seu banco de dados do Firestore não está adequadamente protegido, será possível solucionar as vulnerabilidades ao modificar e testar as suas regras de segurança do Firestore.

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

Como entender as regras de segurança do Firestore

As regras de segurança do Firestore protegem seus dados contra usuários mal-intencionados. As regras padrão para qualquer instância do Firestore criadas 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 aplicativo e testa diferentes configurações para suas regras, use o emulador do Firestore para executar seu aplicativo em um ambiente de desenvolvimento local.

Cenários comuns com regras não seguras

As regras de segurança do Firestore configuradas por padrão ou durante o desenvolvimento inicial do app com o 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 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 com 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

Em alguns casos, as regras de segurança do Firestore 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: acesso restrito usando 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 Firestore como um back-end somente para servidores com o SDK Admin do Firebase. Embora seja seguro, é necessário testar se os clientes do app podem recuperar dados adequadamente.

Saiba mais sobre as regras de segurança do Firestore e como elas funcionam em Primeiros passos com as regras de segurança do Firestore.

Verifique as regras de segurança do Firestore

Para verificar o comportamento do seu aplicativo e suas configurações de regras de segurança do Firestore, use o emulador do Firestore. Use o emulador do Firestore para executar e automatizar testes de unidade em um ambiente local antes de implantar as alterações.

Para testar rapidamente as regras de segurança atualizadas do Firestore no Console do Firebase, use a ferramenta Playground Rules.

  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.