Entenda as regras de segurança do Firebase Realtime Database

As regras de segurança do Firebase Realtime Database determinam quem tem acesso de leitura e gravação ao seu banco de dados, como seus dados são estruturados e quais índices existem. Essas regras residem nos servidores Firebase e são aplicadas automaticamente em todos os momentos. Cada solicitação de leitura e gravação só será concluída se suas regras permitirem. Por padrão, suas regras não permitem que ninguém acesse seu banco de dados. Isso protege seu banco de dados contra abusos até que você tenha tempo de personalizar suas regras ou configurar a autenticação.

As regras de segurança do Realtime Database têm uma sintaxe semelhante ao JavaScript e vêm em quatro tipos:

Tipos de regras
.ler Descreve se e quando os dados podem ser lidos pelos usuários.
.escrever Descreve se e quando os dados podem ser gravados.
.validar Define a aparência de um valor formatado corretamente, se ele possui atributos filho e o tipo de dados.
.indexOn Especifica um filho a ser indexado para dar suporte à ordenação e à consulta.

Visão geral da segurança do Realtime Database

O Firebase Realtime Database oferece um conjunto completo de ferramentas para gerenciar a segurança do seu aplicativo. Essas ferramentas facilitam a autenticação de seus usuários, a aplicação de permissões de usuário e a validação de entradas.

Os aplicativos com tecnologia Firebase executam mais código do lado do cliente do que aqueles com muitas outras pilhas de tecnologia. Portanto, a forma como abordamos a segurança pode ser um pouco diferente da que você está acostumado.

Autenticação

Um primeiro passo comum para proteger seu aplicativo é identificar seus usuários. Este processo é chamado de autenticação . Você pode usar o Firebase Authentication para que os usuários façam login no seu aplicativo. O Firebase Authentication inclui suporte imediato para métodos de autenticação comuns, como Google e Facebook, bem como login por e-mail e senha, login anônimo e muito mais.

A identidade do usuário é um conceito de segurança importante. Usuários diferentes possuem dados diferentes e, às vezes, recursos diferentes. Por exemplo, em um aplicativo de chat, cada mensagem está associada ao usuário que a criou. Os usuários também poderão excluir suas próprias mensagens, mas não as mensagens postadas por outros usuários.

Autorização

Identificar seu usuário é apenas parte da segurança. Depois de saber quem eles são, você precisará controlar o acesso deles aos dados do seu banco de dados. As regras de segurança do banco de dados em tempo real permitem controlar o acesso de cada usuário. Por exemplo, aqui está um conjunto de regras de segurança que permite que qualquer pessoa leia o caminho /foo/ , mas ninguém escreva nele:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

As regras .read e .write estão em cascata, portanto, esse conjunto de regras concede acesso de leitura a quaisquer dados no caminho /foo/ bem como a quaisquer caminhos mais profundos, como /foo/bar/baz . Observe que as regras .read e .write mais superficiais no banco de dados substituem regras mais profundas, portanto, o acesso de leitura a /foo/bar/baz ainda seria concedido neste exemplo, mesmo se uma regra no caminho /foo/bar/baz fosse avaliada como falsa.

As regras de segurança do Realtime Database incluem variáveis ​​e funções integradas que permitem fazer referência a outros caminhos, carimbos de data/hora do servidor, informações de autenticação e muito mais. Aqui está um exemplo de regra que concede acesso de gravação para usuários autenticados para /users/<uid>/ , onde <uid> é o ID do usuário obtido por meio do Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Data de validade

O Firebase Realtime Database não tem esquema. Isso facilita a alteração de coisas à medida que você desenvolve, mas quando seu aplicativo estiver pronto para distribuição, é importante que os dados permaneçam consistentes. A linguagem de regras inclui uma regra .validate que permite aplicar lógica de validação usando as mesmas expressões usadas para regras .read e .write . A única diferença é que as regras de validação não são cascatas , portanto todas as regras de validação relevantes devem ser avaliadas como verdadeiras para que a gravação seja permitida.

Estas regras impõem que os dados gravados em /foo/ devem ser uma string com menos de 100 caracteres:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

As regras de validação têm acesso a todas as mesmas funções e variáveis ​​integradas das regras .read e .write . Você pode usá-los para criar regras de validação que reconhecem dados em outros lugares do banco de dados, a identidade do usuário, o horário do servidor e muito mais.

Definindo índices de banco de dados

O Firebase Realtime Database permite ordenar e consultar dados. Para tamanhos de dados pequenos, o banco de dados oferece suporte a consultas ad hoc, portanto, os índices geralmente não são necessários durante o desenvolvimento. Porém, antes de lançar seu aplicativo, é importante especificar índices para quaisquer consultas necessárias para garantir que elas continuem funcionando à medida que seu aplicativo cresce.

Os índices são especificados usando a regra .indexOn . Aqui está um exemplo de declaração de índice que indexaria os campos de altura e comprimento de uma lista de dinossauros:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Próximos passos