获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

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 estão estruturados e quais índices existem. Essas regras ficam nos servidores do Firebase e são aplicadas automaticamente o tempo todo. 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 é para proteger 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.
.Escreva 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 a 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 usuários, a aplicação de permissões de usuários 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 maneira como abordamos a segurança pode ser um pouco diferente do que você está acostumado.

Autenticação

Uma primeira etapa comum para proteger seu aplicativo é identificar seus usuários. Esse 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 drop-in 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. Diferentes usuários têm dados diferentes e, às vezes, têm recursos diferentes. Por exemplo, em um aplicativo de bate-papo, cada mensagem é associada ao usuário que a criou. Os usuários também podem 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ê precisa de uma maneira de controlar o acesso deles aos dados em seu banco de dados. As regras de segurança do Realtime Database 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 em cascata, portanto, este conjunto de regras concede acesso de leitura a qualquer dado 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 as 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 avaliada como false.

As regras de segurança do Realtime Database incluem variáveis ​​e funções integradas que permitem que você faça referência a outros caminhos, carimbos de data/hora do lado do servidor, informações de autenticação e muito mais. Veja um exemplo de regra que concede acesso de gravação para usuários autenticados em /users/<uid>/ , em que <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 das 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 em cascata , portanto, todas as regras de validação relevantes devem ser avaliadas como true para que a gravação seja permitida.

Essas 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 ​​internas que as regras .read e .write . Você pode usá-los para criar regras de validação que estejam cientes de dados em outros lugares em seu banco de dados, a identidade de seu usuário, hora 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. No entanto, antes de iniciar seu aplicativo, é importante especificar índices para todas as 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 para uma lista de dinossauros:

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

Próximos passos