Utilizzare le espressioni regolari nelle regole di sicurezza di Realtime Database

I valori letterali delle espressioni regolari possono essere utilizzati per convalidare le stringhe fornite dal client. Utilizza string.matches(/pattern/) per verificare se una stringa rispetta un pattern di espressione regolare. La sintassi delle espressioni regolari non è identica alla sintassi delle espressioni regolari comuni, in particolare:

  • * + . ( ) [ ] { } \ funzionano normalmente.
  • Gli ancoraggi ^ e $ funzionano solo se li utilizziamo per trovare una corrispondenza con il primo o l'ultimo carattere del pattern.
  • È supportato solo il flag modificatore i (ignora maiuscole e minuscole)

Valori letterali

Un valore letterale di espressione regolare viene introdotto in un'espressione di sicurezza utilizzando la notazione /pattern/. Per verificare se una stringa rispetta un pattern di espressione regolare, utilizza la funzione membro matches della stringa. La seguente regola di corrispondenza verifica se i nuovi dati iniziano con la stringa foo.

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

Funzionalità supportate

Firebase supporta solo un sottoinsieme delle funzionalità tipiche delle espressioni regolari. Tuttavia, la sintassi delle espressioni regolari dovrebbe risultare familiare.

Questi sono i simboli supportati:

Carattere Significato
\s \w \d \S \W \D Set di caratteri predefiniti per trovare una corrispondenza con uno spazio vuoto, un carattere di parola o una cifra e le relative negazioni (rispettivamente)
\ Escape, il carattere seguente viene interpretato letteralmente.
Se vuoi trovare una corrispondenza con "" stesso, devi anche utilizzare l'escape /\/
^ Ancoraggio all'inizio della stringa. Può essere utilizzato solo come prima lettera del pattern.
/a/ trova una corrispondenza con "ba", mentre /^a/ no.
$ Ancoraggio alla fine della stringa. Può essere utilizzato solo come ultima lettera del pattern.
/a/ trova una corrispondenza con "ab", mentre /a$/ no.
* Trova una corrispondenza con zero o più occorrenze del pattern precedente.
/^a*$/ trova una corrispondenza con "" e "aaa", ma non con "b"
+ Trova una corrispondenza con una o più occorrenze del pattern precedente.
/^a+$/ trova una corrispondenza con "a" e "aaa", ma non con ""
? Trova una corrispondenza con zero o una occorrenza del pattern precedente.
/^a?$/ trova una corrispondenza con "" e "a", ma non con "aa"
. Trova una corrispondenza con qualsiasi carattere
/......../ trova una corrispondenza con "Firebase"
(pattern) Le parentesi raggruppano un pattern in una singola unità
/(ab)*/ trova una corrispondenza con "abab"
a|b Trova una corrispondenza con a o b
/a|bc/ trova una corrispondenza con "ac" or "bc"
[akz] Un set di caratteri, trova una corrispondenza con uno qualsiasi dei caratteri inclusi.
/[ABCDEF]/ trova una corrispondenza solo con le lettere maiuscole da A a F.
[a-z] Un intervallo di caratteri, trova una corrispondenza con tutti i caratteri inclusi nell'intervallo specificato.
/[0-9A-F]+/ trova una corrispondenza con le stringhe esadecimali
[^0-9] Un ^ iniziale nega il set di caratteri, trovando una corrispondenza con qualsiasi elemento diverso dal set di caratteri specificato.

Un i che segue la costruzione del valore letterale dell'espressione regolare (ad es. /yes/i) indica che la corrispondenza non farà distinzione tra maiuscole e minuscole. Al momento non sono supportati altri modificatori di espressioni regolari.

La corrispondenza delle espressioni regolari nelle regole di sicurezza di Firebase Realtime Database non è né greedy né non greedy, poiché consente solo di rilevare una corrispondenza e non di acquisire porzioni della stringa.

Utilizzo

Richiedi che una stringa sia una data nel formato AAAA-MM-GG compresa tra il 1900 e il 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])$/)"

Richiedi che la stringa sia un indirizzo email:

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

Richiedi che la stringa sia un URL di base:

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