Reguläre Ausdrücke für Firebase-Sicherheitsregeln

Mit regulären Ausdrucksliteralen können vom Client bereitgestellte Zeichenfolgen validiert werden. Verwenden Sie string.matches(/pattern/) , um zu testen, ob eine Zeichenfolge einem regulären Ausdrucksmuster entspricht. Die Syntax regulärer Ausdrücke ist nicht identisch mit der Syntax allgemeiner regulärer Ausdrücke, insbesondere:

  • * + . ( ) [ ] { } \ funktioniert wie gewohnt.
  • ^ und $ -Anker funktionieren nur, wenn wir sie verwenden, um mit dem ersten oder letzten Zeichen im Muster übereinzustimmen.
  • Es wird nur das Modifikatorflag i (Groß-/Kleinschreibung ignorieren) unterstützt

Literale

Ein reguläres Ausdrucksliteral wird mithilfe der /pattern/ -Notation in einen Sicherheitsausdruck eingeführt. Um zu testen, ob eine Zeichenfolge einem regulären Ausdrucksmuster entspricht, verwenden Sie die Memberfunktion „Matches“ von Zeichenfolge. Die folgende Übereinstimmungsregel prüft, ob die neuen Daten mit der Zeichenfolge foo beginnen.

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

Unterstützte Funktionen

Firebase unterstützt nur eine Teilmenge typischer regulärer Ausdrucksfunktionen. Die Syntax des regulären Ausdrucks sollte Ihnen jedoch bekannt vorkommen.

Dies sind die unterstützten Symbole:

Charakter Bedeutung
\s \w \d \S \W \D vordefinierte Zeichensätze für den Abgleich von Leerzeichen, einem Wortzeichen oder einer Ziffer und deren Negationen (jeweils)
\ Escape wird das folgende Zeichen wörtlich interpretiert.
Wenn Sie mit „“ selbst übereinstimmen möchten, maskieren Sie es auch /\/
^ Anker am Anfang der Zeichenfolge. Dieser kann nur als erster Buchstabe des Musters verwendet werden.
/a/ stimmt mit „ba“ überein, während /^a/ dies nicht tut.
$ Anker am Ende der Zeichenfolge. Dieser kann nur als letzter Buchstabe des Musters verwendet werden.
/a/ stimmt mit „ab“ überein, während /a$/ dies nicht tut.
* stimmt mit keinem oder vielen der vorhergehenden Muster überein.
/^a*$/ entspricht „“ und „aaa“, aber nicht „b“
+ stimmt mit einem oder mehreren der vorhergehenden Muster überein.
/^a+$/ entspricht „a“ und „aaa“, aber nicht „“
? Entspricht null oder einem der vorhergehenden Muster.
/^a?$/ stimmt mit „“ und „a“ überein, aber nicht mit „aa“
. passt zu jedem Zeichen
/......../ entspricht „Firebase“
(pattern) Klammern gruppieren ein Muster zu einer einzigen Einheit
/(ab)*/ entspricht „abab“
a|b entspricht entweder a oder b
/a|bc/ entspricht „ac“ oder „bc“
[akz] Ein Zeichensatz, der mit einem der enthaltenen Zeichen übereinstimmt.
/[ABCDEF]/ stimmt nur mit Großbuchstaben von A bis F überein.
[az] ein Zeichenintervall, das alle Zeichen einschließlich im angegebenen Bereich abgleicht.
/[0-9A-F]+/ entspricht hexadezimalen Zeichenfolgen
[^0-9] Ein führendes ^ negiert den Zeichensatz und passt auf alles andere als den angegebenen Zeichensatz.

Ein i hinter der Literalkonstruktion des regulären Ausdrucks (z. B. /yes/i ) zeigt an, dass bei der Übereinstimmung die Groß-/Kleinschreibung nicht beachtet wird. Andere Modifikatoren für reguläre Ausdrücke werden derzeit nicht unterstützt.

Der Abgleich regulärer Ausdrücke in den Sicherheitsregeln der Firebase-Echtzeitdatenbank ist weder gierig noch nicht gierig, da er nur die Erkennung einer Übereinstimmung und nicht die Erfassung von Teilen der Zeichenfolge ermöglicht.

Verwendung

Erfordern, dass eine Zeichenfolge ein Datum im Format JJJJ-MM-TT zwischen 1900 und 2099 ist:

".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])$/)"

Zeichenfolge muss eine E-Mail-Adresse sein:

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

Zeichenfolge muss eine Basis-URL sein:

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