Corrija regras não seguras
Use este guia para compreender as vulnerabilidades comuns nas configurações das regras de segurança do Firestore, rever e proteger melhor as suas próprias regras e testar as alterações antes de as implementar.
Se receber um alerta de que a sua base de dados do Firestore no modo nativo não está devidamente protegida, pode resolver as vulnerabilidades modificando e testando as Regras de segurança do Firestore.
Para ver as suas regras de segurança existentes, aceda ao separador Regras na consola do Firebase.
Compreenda as suas regras de segurança do Firestore
As Regras de segurança do Firestore protegem os seus dados de utilizadores maliciosos. As regras predefinidas para qualquer instância do Firestore no modo nativo criada na consola do Firebase negam o acesso a todos os utilizadores. Para desenvolver a sua app e aceder à base de dados, tem de modificar essas regras e pode considerar conceder acesso geral a todos os utilizadores num ambiente de desenvolvimento. No entanto, antes de implementar a sua app num ambiente de produção, dedique algum tempo a configurar corretamente as regras e proteger os seus dados.
À medida que desenvolve a sua app e testa diferentes configurações para as suas regras, use o emulador do Firestore no modo nativo para executar a app num ambiente de desenvolvimento local.
Cenários comuns com regras não seguras
As regras de segurança do Firestore que pode ter configurado por predefinição ou à medida que trabalhava no desenvolvimento da sua app com o Firestore no modo nativo devem ser revistas e atualizadas antes de implementar a app. Certifique-se de que protege corretamente os dados dos seus utilizadores evitando os seguintes erros comuns.
Acesso aberto
À medida que configura o Firestore no modo nativo, pode ter definido as regras para permitir o acesso aberto durante o desenvolvimento. Pode pensar que é a única pessoa a usar a sua app, mas, se a implementou, está disponível na Internet. Se não estiver a autenticar os utilizadores e a configurar regras de segurança, qualquer pessoa que adivinhe o ID do seu projeto pode roubar, modificar ou eliminar os dados.
Não recomendado: acesso de leitura e escrita a todos os utilizadores. |
// 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 escrita.
Crie regras que façam sentido para a sua hierarquia de dados. Uma das soluções comuns para esta insegurança é a segurança baseada no utilizador com a autenticação do Firebase. Saiba mais acerca da autenticação de utilizadores com regras. |
Apenas 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 utilizador autenticado
Por vezes, as regras de segurança do Firestore verificam se um utilizador tem sessão iniciada, mas não restringem ainda mais o acesso com base nessa autenticação. Se uma das suas regras incluir
auth != null
, confirme que quer que qualquer utilizador com sessão iniciada tenha acesso aos
dados.
Não recomendado: qualquer utilizador com sessão iniciada tem acesso de leitura e escrita a toda a sua base 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 através de condições de segurança.
Quando estiver a verificar a autenticação, também pode usar uma das propriedades de autenticação para restringir ainda mais o acesso a utilizadores específicos para conjuntos de dados específicos. Saiba mais sobre como adicionar condições de segurança e acesso com base em funções. |
Acesso com base em funções
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 baseado 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 para endereços de email não validados
Por vezes, as regras de segurança do Firestore verificam se o email de um utilizador pertence a um domínio específico. Embora seja geralmente uma boa prática, os emails nem sempre são validados durante o início de sessão até que o utilizador execute um passo adicional após a receção de um email de validação. Certifique-se de que está a validar que o email pertence efetivamente ao utilizador.
Não recomendado: qualquer utilizador pode iniciar sessão com um endereço de email arbitrário. |
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email.endsWith('@example.com') } } }
Solução: restrinja o acesso apenas a emails validados. |
Valide emails
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email_verified && request.auth.email.endsWith('@example.com') } } }
Acesso fechado
Enquanto desenvolve a sua app, outra abordagem comum é manter os dados bloqueados. Normalmente, isto significa que fechou o acesso de leitura e escrita a todos os utilizadores, da seguinte forma:
// 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 as Cloud Functions continuam a poder aceder à sua base de dados. Use estas regras quando pretender usar o Firestore no modo nativo como um back-end apenas de servidor em conjunto com o SDK de administração do Firebase. Embora seja seguro, deve testar se os clientes da sua app conseguem obter dados corretamente.
Saiba mais sobre as regras de segurança do Firestore e como funcionam no artigo Comece a usar as regras de segurança do Firestore.
Verifique as regras de segurança do Firestore
Para verificar o comportamento da sua app e validar as configurações das regras de segurança do Firestore, use o emulador do Firestore no modo nativo. Use o emulador do Firestore no modo nativo para executar e automatizar testes de unidade num ambiente local antes de implementar quaisquer alterações.
Para testar rapidamente as suas regras de segurança do Firestore atualizadas na consola do Firebase, use a ferramenta Rules Playground.
- Para abrir o Rules Playground, clique em Rules playground no separador Regras.
- Nas definições da área de testes de regras, selecione as opções para o teste, incluindo:
- Testar leituras ou escritas
- Uma Localização específica na sua base de dados, como um caminho
- Tipo de autenticação: utilizador anónimo não autenticado, utilizador anónimo autenticado ou um ID de utilizador específico
- Dados específicos do documento aos quais as suas regras fazem referência especificamente (por exemplo, se as suas regras exigirem a presença de um campo específico antes de permitir uma gravação)
- Clique em Executar e procure os resultados na faixa acima da janela de regras.