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

Os literais de expressão regular podem ser usados para validar as 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ões regulares não é idêntica à sintaxe de expressões regulares comuns, em particular:

  • * + . ( ) [ ] { } \ funcionam normalmente.
  • As âncoras ^ e $ só funcionam quando são usadas para corresponder ao primeiro ou ao último caractere no padrão.
  • apenas a sinalização do modificador i (ignorar maiúsculas e minúsculas) tem suporte

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 adere a um padrão de expressão regular, use a função membro de correspondências da string. A seguinte regra de correspondência verifica se os novos dados começam com a string foo.

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

Recursos compatíveis

O Firebase é compatível apenas com 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 aceitos:

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 as negações (respectivamente)
\ escape, o caractere seguinte será interpretado literalmente.
Se você quiser fazer a correspondência com "" em si, escapar também /\/
^ ao início da string. Só pode ser usado como a primeira letra do padrão.
/a/ corresponde a "ba", e /^a/ não.
$ ao final da string. Só pode ser usado como a última letra do padrão.
e /a/ corresponde a "ab", enquanto /a$/ não.
* corresponde a zero ou vários do padrão anterior.
/^a*$/ corresponde a "" e "aaa", mas não "b"
+ corresponde a um ou mais do padrão anterior.
/^a+$/ corresponde a "a" e "aaa", mas não ""
? corresponde a zero ou a um do padrão anterior.
/^a?$/ corresponde a "" e "a", mas não "aa"
. corresponde a qualquer caractere
/......../ corresponde a "Firebase"
(pattern) parênteses agrupam 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]/ correspondência somente em letras maiúsculas letras de A a F.
[a-z] um intervalo de caracteres, corresponde a todos os caracteres inclusivamente no intervalo especificado.
e /[0-9A-F]+/ corresponde a strings hexadecimais
[^0-9] Um ^ inicial nega o conjunto de caracteres, correspondendo a qualquer coisa que não seja o conjunto especificado.

Um i depois da construção do literal de expressão regular (por exemplo, /yes/i) indica que a correspondência não diferencia maiúsculas de minúsculas. No momento, outros modificadores de expressão regular não são compatíveis.

A correspondência de expressão regular no Firebase Realtime Database Security Rules não é gananciosa nem não gananciosa, já que ela só permite detectar uma correspondência e não capturar partes da string.

Uso

Exigir que uma string seja uma data no formato 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])$/)"

A string precisa ser um endereço de e-mail:

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

A string precisa ser 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"