Ir para o console

Como proteger os arquivos

No Cloud Storage, você tem um modelo de segurança baseado em caminho declarativo denominado "regras de segurança do Firebase para Cloud Storage". Com esse modelo, você protege os arquivos de forma rápida e fácil.

Entender as regras

As regras de segurança do Firebase para Cloud Storage são usadas para determinar quem tem acesso de leitura e gravação aos arquivos armazenados no Cloud Storage. Elas também definem a forma como os arquivos estão estruturados e quais metadados eles contêm. O tipo básico de regra é allow. Ela permite que condições opcionais sejam especificadas nas solicitações de read e write. Por exemplo:

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

Verificar correspondência de caminhos

Com as regras de segurança de armazenamento match, você verifica a correspondência dos caminhos usados para acessar os arquivos do Cloud Storage. As regras match verificam caminhos exatos ou curinga e também podem ser aninhadas. Se nenhuma regra de correspondência permite um método de solicitação ou se a condição é avaliada como false, a solicitação é negada.

Correspondências exatas

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

Correspondências aninhadas

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Correspondências curinga

Use regras match para definir um padrão correspondente usando caracteres curinga. Um caractere curinga é uma variável nomeada que representa uma string individual, como profilePhoto.png ou vários segmentos de caminhos, como images/profilePhoto.png.

Para criar um caractere curinga, basta colocar o nome do curinga entre chaves, como {string}. Para declarar um caractere curinga com vários segmentos, adicione =** ao nome, como {path=**}:

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Se um arquivo atende a várias regras de correspondência, o OR do resultado de todas as avaliações é fornecido. Ou seja, se qualquer regra aplicada ao arquivo é avaliada como true, o resultado é true.

Nas regras acima, o arquivo "images/profilePhoto.png" pode ser lido se condition ou other_condition são avaliados como true, e o arquivo "images/users/user:12345/profilePhoto.png" está sujeito apenas ao resultado de other_condition.

Uma variável curinga pode ser referenciada de dentro do match, basta fornecer a autorização do nome do arquivo ou caminho:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

As regras de segurança do Storage não são aplicadas em cascata e só são avaliadas se o caminho da solicitação corresponde a um caminho com regras especificadas.

Avaliação de solicitação

Uploads, downloads, alterações em metadados e exclusões são avaliados com a request enviada ao Cloud Storage. No caso de uma solicitação de gravação, a variável request contém o caminho do arquivo, o horário de recebimento e o novo valor do resource. Os cabeçalhos HTTP e o estado de autenticação também são incluídos.

O objeto request também contém o código exclusivo do usuário e o payload do Firebase Authentication no objeto request.auth. Essa informação está detalhada na seção Segurança baseada no usuário da documentação.

Veja uma lista completa das propriedades do objeto request abaixo:

Propriedade Tipo Descrição
auth map<string, string> Quando um usuário está conectado, são fornecidos o uid, ID exclusivo do usuário, e o token, um mapa de declarações de JWT do Firebase Authentication. Caso contrário, o valor é null.
params map<string, string> Mapa contendo os parâmetros de consulta da solicitação.
path path Um path representando o caminho no qual a solicitação é executada.
resource map<string, string> O novo valor do recurso, presente apenas nas solicitações de write.
time timestamp Timestamp que representa o horário do servidor no qual a solicitação é avaliada.

Avaliação de recurso

Durante a avaliação de regras, você também pode avaliar os metadados do arquivo do qual está fazendo upload, download, modificando ou excluindo. Crie regras complexas e eficazes como, por exemplo, permitir somente o upload de arquivos com um conteúdo específico ou apenas a exclusão de arquivos acima de um determinado tamanho.

As regras de segurança do Firebase para Cloud Storage fornecem metadados de arquivo no objeto resource. Ele contém pares de chave/valor dos metadados expostos em um objeto do Cloud Storage. Inspecione essas propriedades nas solicitações read ou write para garantir a integridade dos dados.

Além do objeto resource, que contém metadados do arquivo existente no caminho da solicitação, use o objeto request.resource nas solicitações write, como upload, atualização de metadados e exclusão. Ele contém um subconjunto dos metadados do arquivo a ser gravado, se permitido. Use esses dois valores para garantir a integridade dos dados ou para aplicar restrições de aplicativo, como tipo ou tamanho de arquivo.

Veja uma lista completa de propriedades do objeto resource abaixo:

Propriedade Tipo Descrição
name string Nome completo do objeto.
bucket string Nome do repositório do objeto.
generation int Geração de objeto GCS do objeto.
metageneration int Metageração de objeto GCS do objeto.
size int Tamanho do objeto em bytes.
timeCreated timestamp Timestamp que indica o horário em que um objeto foi criado.
updated timestamp Timestamp que indica o horário em que um objeto foi atualizado pela última vez.
md5Hash string Hash MD5 do objeto.
crc32c string Hash crc32c do objeto.
etag string Etag associada ao objeto.
contentDisposition string Disposição do conteúdo associado ao objeto.
contentEncoding string Codificação do conteúdo associado ao objeto.
contentLanguage string Idioma do conteúdo associado ao objeto.
contentType string Tipo do conteúdo associado ao objeto.
metadata map Outros pares de chave/valor de metadados personalizados especificados pelo desenvolvedor.

O request.resource contém tudo isso, exceto generation, metageneration, etag, timeCreated e updated.

Exemplo completo

Reúna todos esses recursos e crie um exemplo completo de regras para uma solução de armazenamento de imagens:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

Agora vamos integrar o Firebase Authentication para permitir o acesso mais granular aos arquivos por usuário na seção Segurança do usuário.