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