Firebase 安全性規則規則運算式

規則運算式常值,可用於驗證用戶端提供的字串。使用 string.matches(/pattern/) 測試字串是否符合規則運算式模式。規則運算式語法與常見的規則運算式語法不同,特別是:

  • * + . ( ) [ ] { } \ 照常運作。
  • 只有當我們使用 ^$ 錨點來比對模式的第一個或最後一個字元時,才能讓錨點生效。
  • 僅支援 i (不區分大小寫) 修飾符標記

文字

系統會使用 /pattern/ 標記法將規則運算式常值引入安全性運算式。如要測試字串是否符合規則運算式模式,請使用字串的比對成員函式。下列比對規則會檢查新資料的開頭是否為 foo 字串。

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

支援功能

Firebase 僅支援部分一般規則運算式功能。不過,規則運算式語法應該對您十分熟悉。

支援的符號如下:

角色 意義
\s \w \d \S \W \D 用來比對空白字元、文字字元或數字及其否定的預先定義字元集 (分別)
\ 逸出,以下字元會依字面解讀。
如果要比對「」本身就要避開 /\/
^ 並固定至字串開頭只能做為模式的第一個字母。
/a/ 與「ba」相符,但 /^a/ 則否。
$ 並固定在字串結尾處只能做為模式的最後一個字母。
/a/ 與「ab」相符,而 /a$/ 則不。
* 會比對零或多個前述模式。
/^a*$/與「」相符和「aaa」,但不包括「b」
+ 會符合一或多個前述模式。
/^a+$/ 與「a」相符和「aaa」,但不包括「」
? 會與零或前一個模式相符。
/^a?$/與「」相符和「a」,但不包括「aa」
. 符合任何字元
/......../ 與「Firebase」相符
(pattern) 括號會將模式組合成單一單位
/(ab)*/ 與「abab」相符
a|b 符合 a 或 b
/a|bc/ 與「ac」相符或「bc」
[akz] 字元集,比對任何加入的字元。
/[ABCDEF]/ 個相符的項目 (全為大寫) 由 A 到 F 的英文字母
[a-z] 字元間隔,會比對所有包含指定範圍中的字元。
/[0-9A-F]+/ 比對十六進位字串
[^0-9] 開頭的 ^ 會否定字元集,比對指定字元集以外的任何內容。

以規則運算式常值建構結尾的 i (例如 /yes/i) 表示比對不區分大小寫。目前不支援其他規則運算式修飾符。

Firebase Realtime Database Security Rules 中的規則運算式比對並非貪婪或非貪婪,因為這只能讓您偵測相符項目,而不會擷取字串的部分內容。

用量

字串必須是 YYYY-MM-DD (介於 1900-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])$/)"

要求字串必須是電子郵件地址:

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

要求字串必須為基本網址:

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