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.
- Para abrir o Playground de regras, clique em Playground de regras na guia Regras.
- 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)
- Clique em Executar e procure os resultados no banner acima da janela de regras.