Usar expressões regulares nas regras de segurança do Realtime Database

Os literais de expressão regular podem ser usados para validar strings fornecidas pelo cliente. Use string.matches(/pattern/) para testar se uma string segue um padrão de expressão regular. A sintaxe de expressão regular não é idêntica à sintaxe comum de expressões regulares, em particular:

  • * + . ( ) [ ] { } \ funcionam normalmente.
  • As âncoras ^ e $ só funcionam se as usarmos para corresponder ao primeiro ou último caractere no padrão.
  • somente a flag de modificador i (ignorar caso) é compatível

Literais

Um literal de expressão regular é introduzido em uma expressão de segurança usando a notação /pattern/. Para testar se uma string segue um padrão de expressão regular, use a função de membro de correspondências da string. A regra de correspondências a seguir verifica se os novos dados começam com a string foo.

".validate": "newData.val().matches(/^foo/)"

Recursos compatíveis

O Firebase oferece suporte apenas a um subconjunto de recursos típicos de expressão regular. No entanto, a sintaxe de expressão regular deve ser familiar.

Estes são os símbolos compatíveis:

Personagem Significado
\s \w \d \S \W \D conjuntos de caracteres predefinidos para correspondência de espaço em branco, um caractere de palavra ou um dígito e suas negações (respectivamente)
\ escape, o caractere a seguir é interpretado literalmente.
Se você quiser corresponder a "", também faça o escape dele /\/
^ âncora para o início da string. Isso só pode ser usado como a primeira letra do padrão.
/a/ corresponde a "ba", enquanto /^a/ não.
$ âncora para o final da string. Isso só pode ser usado como a última letra do padrão.
/a/ corresponde a "ab", enquanto /a$/ não.
* corresponde a zero ou muitas ocorrências do padrão anterior.
/^a*$/ corresponde a "" e "aaa", mas não a "b"
+ corresponde a uma ou mais ocorrências do padrão anterior.
/^a+$/ corresponde a "a" e "aaa", mas não a ""
? corresponde a zero ou uma ocorrência do padrão anterior.
/^a?$/ corresponde a "" e "a", mas não a "aa"
. corresponde a qualquer caractere
/......../ corresponde a "Firebase"
(pattern) parênteses agrupa um padrão em uma única unidade
/(ab)*/ corresponde a "abab"
a|b corresponde a a ou b
/a|bc/ corresponde a "ac" ou "bc"
[akz] um conjunto de caracteres, corresponde a qualquer um dos caracteres incluídos.
/[ABCDEF]/ corresponde apenas a letras maiúsculas de A a F.
[a-z] um intervalo de caracteres, corresponde a todos os caracteres inclusivos no intervalo especificado.
/[0-9A-F]+/ corresponde a strings hexadecimais
[^0-9] Um ^ inicial nega o conjunto de caracteres, correspondendo a qualquer coisa diferente do conjunto de caracteres especificado.

Um i após a construção literal de expressão regular (por exemplo, /yes/i) indica que a correspondência não vai diferenciar maiúsculas de minúsculas. Outros modificadores de expressão regular não são compatíveis no momento.

A correspondência de expressão regular nas regras de segurança do Firebase Realtime Database não é gananciosa nem não gananciosa, porque ela só permite detectar uma correspondência e não capturar partes da string.

Uso

Exigir que uma string seja uma data formatada como AAAA-MM-DD entre 1900 e 2099:

".validate": "newData.isString() && newData.val().matches(/^(19|20)[0-9][0-9][-\\/. ](0[1-9]|1[012])[-\\/. ](0[1-9]|[12][0-9]|3[01])$/)"

Exigir que a string seja um endereço de e-mail:

".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"

Exigir que a string seja um URL básico:

".validate": "newData.isString() && newData.val().matches(/^(ht|f)tp(s?):\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*((0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"