Esta página foi traduzida pela API Cloud Translation.
Switch to English

Como corrigir de regras não seguras

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 read, write: if request.auth != null && request.auth.uid == request.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 read: if true
      allow write: if request.auth != null && request.auth.uid == request.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.