Corrigir regras inseguras

Use este guia para entender vulnerabilidades comuns nas configurações de regras de segurança do Cloud Firestore, revisar 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 Cloud Firestore não está devidamente protegido, poderá resolver as vulnerabilidades modificando e testando as regras de segurança do Cloud Firestore.

Para visualizar suas regras de segurança existentes, acesse a guia Regras no console do Firebase.

Entenda suas regras de segurança do Cloud Firestore

As regras de segurança do Cloud Firestore protegem seus dados contra usuários mal-intencionados. As regras padrão para qualquer instância do Cloud Firestore criada no console do Firebase negam acesso a todos os usuários. Para desenvolver seu aplicativo e acessar seu banco de dados, você precisará modificar essas regras e poderá considerar conceder acesso geral a todos os usuários em um ambiente de desenvolvimento. Antes de implantar seu aplicativo em um ambiente de produção, reserve um tempo para configurar adequadamente suas regras e proteger seus dados.

Ao desenvolver seu aplicativo e testar configurações diferentes para suas regras, use o emulador do Cloud Firestore para executar seu aplicativo em um ambiente de desenvolvimento local.

Cenários comuns com regras inseguras

As regras de segurança do Cloud Firestore que você pode ter configurado por padrão ou quando trabalhou inicialmente no desenvolvimento do seu aplicativo com o Cloud Firestore devem ser revisadas e atualizadas antes de implantar o seu aplicativo. Certifique-se de proteger adequadamente os dados dos seus usuários, evitando as seguintes armadilhas comuns.

Acesso livre

Ao configurar o Cloud Firestore, você pode ter definido suas regras para permitir acesso aberto durante o desenvolvimento. Você pode pensar que é a única pessoa que usa seu aplicativo, mas se o tiver implantado, ele estará disponível na Internet. Se você não estiver autenticando usuários e configurando regras de segurança, qualquer pessoa que adivinhar o ID do seu projeto poderá roubar, modificar ou excluir os dados.

Não recomendado: acesso de leitura e gravação para 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.

Crie regras que façam sentido para sua hierarquia de dados. Uma das soluções comuns para essa insegurança é a segurança baseada no usuário com Firebase Authentication. Saiba mais sobre como autenticar usuários com regras .

Somente 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 misto público e privado

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

Às vezes, as regras de segurança do Cloud Firestore verificam se um usuário está conectado, mas não restringem ainda mais o acesso com base nessa autenticação. Se uma de suas regras incluir auth != null , confirme se deseja que qualquer usuário conectado tenha acesso aos dados.

Não recomendado: qualquer usuário conectado terá acesso de leitura e gravação em todo o seu 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 utilizando condições de segurança.

Ao verificar a autenticação, você também pode querer usar uma das propriedades de autenticação para restringir ainda mais o acesso a usuários específicos para conjuntos de dados específicos. Saiba mais sobre como adicionar condições de segurança e acesso baseado em função .

Acesso baseado em 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 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 misto público e privado

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

Enquanto você desenvolve seu aplicativo, outra abordagem comum é manter seus dados bloqueados. Normalmente, isso significa que você fechou o acesso de leitura e gravação a todos os usuários, 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 o Cloud Functions ainda podem acessar seu banco de dados. Use essas regras quando pretender usar o Cloud Firestore como back-end somente de servidor em conjunto com o SDK Admin do Firebase. Embora seja seguro, você deve testar se os clientes do seu aplicativo podem recuperar dados corretamente.

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

Verifique suas regras de segurança do Cloud Firestore

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

Para testar rapidamente suas regras de segurança atualizadas do Cloud Firestore no console do Firebase, use a ferramenta Rules Playground.

  1. Para abrir o Playground de regras, clique em Playground de regras na guia Regras .
  2. Nas configurações do playground de regras , selecione opções para seu teste, incluindo:
    • Testando leituras ou gravações
    • Um local específico no seu banco de dados, como um caminho
    • Tipo de autenticação — usuário anônimo autenticado e não autenticado ou um ID de usuário específico
    • Dados específicos do documento aos quais suas regras fazem referência específica (por exemplo, se suas regras exigirem 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.