Reguläre Ausdrücke in Sicherheitsregeln für Realtime Database verwenden

Mit regulären Ausdrucksliteralen können vom Client bereitgestellte Strings validiert werden. Verwenden Sie string.matches(/pattern/), um zu testen, ob ein String einem regulären Ausdrucksmuster entspricht. Die Syntax für reguläre Ausdrücke ist nicht mit der allgemeinen Syntax für reguläre Ausdrücke identisch. Insbesondere gilt Folgendes:

  • * + . ( ) [ ] { } \ funktionieren wie gewohnt.
  • Die Anker ^ und $ funktionieren nur, wenn sie verwendet werden, um das erste oder letzte Zeichen im Muster abzugleichen.
  • Es wird nur das Modifikator-Flag i (Groß-/Kleinschreibung ignorieren) unterstützt.

Literale

Ein reguläres Ausdrucksliteral wird mit der Notation /pattern/ in einen Sicherheitsausdruck eingeführt. Verwenden Sie die Member-Funktion „matches“ des Strings, um zu testen, ob ein String einem regulären Ausdrucksmuster entspricht. Mit der folgenden Regel wird geprüft, ob die neuen Daten mit dem String „foo“ beginnen.

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

Unterstützte Features

Firebase unterstützt nur eine Teilmenge der typischen Features für reguläre Ausdrücke. Die Syntax für reguläre Ausdrücke sollte Ihnen jedoch bekannt vorkommen.

Folgende Symbole werden unterstützt:

Zeichen Bedeutung
\s \w \d \S \W \D Vordefinierte Zeichensätze für den Abgleich von Leerzeichen, einem Wortzeichen oder einer Ziffer und deren Negationen (bzw.)
\ Escapezeichen. Das folgende Zeichen wird wörtlich interpretiert.
Wenn Sie "" selbst abgleichen möchten, müssen Sie es auch mit einem Escapezeichen versehen: /\/
^ Anker für den Anfang des Strings. Kann nur als erster Buchstabe des Musters verwendet werden.
/a/ stimmt mit „ba“ überein, /^a/ jedoch nicht.
$ Anker für das Ende des Strings. Kann nur als letzter Buchstabe des Musters verwendet werden.
/a/ stimmt mit „ab“ überein, /a$/ jedoch nicht.
* Stimmt mit null oder vielen Instanzen des vorherigen Musters überein.
/^a*$/ stimmt mit "" und „aaa“ überein, aber nicht mit „b“.
+ Stimmt mit einer oder mehreren Instanzen des vorherigen Musters überein.
/^a+$/ stimmt mit „a“ und „aaa“ überein, aber nicht mit "".
? Stimmt mit null oder einer Instanz des vorherigen Musters überein.
/^a?$/ stimmt mit "" und „a“ überein, aber nicht mit „aa“.
. Stimmt mit einem beliebigen Zeichen überein.
/......../ stimmt mit „Firebase“ überein.
(pattern) Klammern gruppieren ein Muster zu einer einzelnen Einheit.
/(ab)*/ stimmt mit „abab“ überein.
a|b Stimmt entweder mit „a“ oder „b“ überein.
/a|bc/ stimmt mit „ac“ oder „bc“ überein.
[akz] Ein Zeichensatz, der mit einem der enthaltenen Zeichen übereinstimmt.
/[ABCDEF]/ stimmt nur mit Großbuchstaben von A bis F überein.
[a-z] Ein Zeichenintervall, das mit allen Zeichen im angegebenen Bereich übereinstimmt.
/[0-9A-F]+/ stimmt mit hexadezimalen Strings überein.
[^0-9] Ein führendes ^ negiert den Zeichensatz und stimmt mit allem überein, was nicht dem angegebenen Zeichensatz entspricht.

Ein i nach der regulären Ausdrucksliteralkonstruktion (z.B. /yes/i) gibt an, dass beim Abgleich die Groß-/Kleinschreibung nicht berücksichtigt wird. Andere Modifikatoren für reguläre Ausdrücke werden derzeit nicht unterstützt.

Beim Abgleich regulärer Ausdrücke in den Sicherheitsregeln der Firebase Realtime Database wird weder der Greedy- noch der Non-Greedy-Modus verwendet, da Sie nur eine Übereinstimmung erkennen und keine Teile des Strings erfassen können.

Nutzung

Erfordert, dass ein String 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])$/)"

Erfordert, dass ein String eine E-Mail-Adresse ist:

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

Erfordert, dass ein String eine einfache URL ist:

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