Firebase セキュリティ ルールの正規表現

正規表現リテラルを使用して、クライアントから提供された文字列を検証できます。string.matches(/pattern/) を使用して、文字列が正規表現パターンに準拠しているかどうかをテストします。正規表現の構文は、特に次の一般的な正規表現の構文と同一ではありません。

  • * + . ( ) [ ] { } \ が正常に動作します。
  • ^ アンカーと $ アンカーは、パターンの先頭または最後の文字とのマッチングに使用する場合にのみ機能します。
  • i(大文字と小文字を区別しない)修飾子フラグのみがサポートされています

リテラル

正規表現リテラルは、/pattern/ 表記を使用してセキュリティ式に導入されます。文字列が正規表現パターンに準拠しているかどうかをテストするには、string の match メンバー関数を使用します。次の一致ルールは、新しいデータが文字列 foo で始まるかどうかをチェックします。

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

サポートされる機能

Firebase では、一般的な正規表現機能のサブセットのみがサポートされています。ただし、正規表現の構文にはなじみがあるはずです。

サポートされている記号は次のとおりです。

文字 意味
\s \w \d \S \W \D 空白文字、単語文字、数字を照合するための事前定義された文字セットとそれらの否定 (それぞれ)
\ 後に続く文字は文字どおりに解釈されます。
「」を照合する場合検出する代わりに、 /\/
^ 文字列の先頭に固定します。パターンの最初の文字としてのみ使用できます。
/a/ は「ba」に一致しますが、/^a/ は一致しません。
$ 文字列の末尾にアンカーします。パターンの最後の文字としてのみ使用できます。
/a/ 「ab」は一致しますが、/a$/ は一致しません。
* 直前のパターンの 0 個以上に一致します。
/^a*$/ が「」と一致しました「aaa」は入力でき、「b」は含まれない
+ 直前のパターンの 1 つ以上に一致します。
/^a+$/ は「a」と一致しますと「aaa」は一致しますが、「」は一致しません。
? 直前のパターンの 0 または 1 に一致します。
/^a?$/ が「」と一致しました「aa」は入力できるが、「aa」は使用できない
. 任意の文字に一致
/......../ は「Firebase」に一致
(pattern) かっこは、パターンを 1 つの単位にグループ化します
/(ab)*/ は「abab」と一致します
a|b a または b に一致
/a|bc/ は「ac」と一致または「bc」
[akz] 任意の文字セットに一致します。
/[ABCDEF]/」は大文字でのみ一致します アルファベットの A ~ F です
[a-z] 文字間隔。指定した範囲内のすべての文字に一致します。
/[0-9A-F]+/ 16 進数の文字列に一致
[^0-9] 先頭の ^ は文字セットを否定し、指定された文字セット以外に一致します。

正規表現のリテラル構造(/yes/i など)の末尾に i がある場合は、照合で大文字と小文字が区別されないことを示します。現時点では、その他の正規表現の修飾子はサポートされていません。

Firebase Realtime Database Security Rules の正規表現による一致は、「欲張り」でも「非欲張り」でもありません。これは、一致を検出できるだけで、文字列の一部は捕捉できないためです。

用途

文字列は 1900 ~ 2099 の間の YYYY-MM-DD 形式の日付である必要があります。

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

文字列をメールアドレスにする必要があります。

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

文字列は基本的な URL であることを必須とします。

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