Expressões regulares das regras de segurança do Firebase

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 da expressão regular não é idêntica à sintaxe das expressões regulares comuns, em particular:

  • * + . ( ) [ ] { } \ funciona normalmente.
  • As âncoras ^ e $ só funcionam se as usarmos para corresponder ao primeiro ou último caractere do padrão.
  • apenas o sinalizador modificador i (ignorar maiúsculas e minúsculas) é suportado

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 matches de string. A seguinte regra de correspondência verifica se os novos dados começam com a string foo.

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

Recursos suportados

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

Estes são os símbolos suportados:

Personagem Significado
\s \w \d \S \W \D conjuntos de caracteres predefinidos para correspondência de espaço em branco, caractere de palavra ou dígito e suas negações (respectivamente)
\ escape, o caractere seguinte é interpretado literalmente.
Se você quiser combinar com "" em si, escape também /\/
^ âncora no 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 no final da corda. Isso só pode ser usado como a última letra do padrão.
/a/ corresponde a "ab", enquanto /a$/ não.
* corresponde a zero ou muitos do padrão anterior.
/^a*$/ corresponde a "" e "aaa", mas não a "b"
+ corresponde a um ou mais dos padrões anteriores.
/^a+$/ corresponde a "a" e "aaa", mas não a ""
? corresponde a zero ou um dos padrões anteriores.
/^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.
[az] um intervalo de caracteres, corresponde a todos os caracteres inclusive 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 à direita da construção literal da expressão regular (por exemplo /yes/i ) indica que a correspondência não diferencia maiúsculas de minúsculas. Outros modificadores de expressões regulares não são suportados no momento.

A correspondência de expressões regulares nas regras de segurança do Firebase Realtime Database não é gananciosa nem não gananciosa, pois permite apenas detectar uma correspondência e não capturar partes da string.

Uso

Exija que uma string seja uma data formatada como AAAA-MM-DD entre 1900-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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"