นิพจน์ทั่วไปของกฎการรักษาความปลอดภัยของ Firebase

ลิเทอรัลของนิพจน์ทั่วไปใช้เพื่อตรวจสอบสตริงที่ไคลเอ็นต์ระบุได้ ใช้ string.matches(/pattern/) เพื่อทดสอบว่าสตริงเป็นไปตามรูปแบบนิพจน์ทั่วไปหรือไม่ ไวยากรณ์นิพจน์ทั่วไปไม่เหมือนกับไวยากรณ์นิพจน์ทั่วไปทั่วไป โดยเฉพาะ:

  • * + . ( ) [ ] { } \ ทำงานได้ตามปกติ
  • แท็ก Anchor ^ และ $ จะใช้งานได้ก็ต่อเมื่อเราใช้จุดยึดเหล่านี้เพื่อจับคู่อักขระตัวแรกหรือตัวสุดท้ายในรูปแบบ
  • รองรับเฉพาะแฟล็กแป้นกดร่วม i (ไม่คำนึงถึงตัวพิมพ์ใหญ่/เล็ก) เท่านั้น

ลิเทอรัล

ลิงก์ของนิพจน์ทั่วไปจะมีอยู่ในนิพจน์ความปลอดภัยโดยใช้รูปแบบ /pattern/ หากต้องการทดสอบว่าสตริงเป็นไปตามรูปแบบนิพจน์ทั่วไปหรือไม่ ให้ใช้ฟังก์ชันจับคู่สมาชิกของสตริง กฎการจับคู่ต่อไปนี้จะตรวจสอบว่าข้อมูลใหม่ขึ้นต้นด้วย foo หรือไม่

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

ฟีเจอร์ที่รองรับ

Firebase รองรับเฉพาะชุดย่อยของฟีเจอร์นิพจน์ทั่วไปทั่วไป แต่ไวยากรณ์นิพจน์ทั่วไปควรดูคุ้นเคย

สัญลักษณ์ที่รองรับมีดังนี้

ตัวละคร ความหมาย
\s \w \d \S \W \D ชุดอักขระที่กำหนดไว้ล่วงหน้าสำหรับช่องว่างที่ตรงกัน อักขระที่เป็นคำ หรือตัวเลข และนิเสธ (ตามลำดับ)
\ Escape อักขระต่อไปนี้จะถูกตีความอย่างตรงตัว
หากต้องการจับคู่กับ "" ให้หลบเลี่ยงด้วย วันที่ /\/
^ Anchor ที่ส่วนต้นของสตริง สามารถใช้เป็นตัวอักษรแรกของรูปแบบเท่านั้น
/a/ ไม่จับคู่กับ "ba" ในขณะที่ /^a/ ไม่จับคู่กับ "ba"
$ Anchor ที่ส่วนท้ายของสตริง สามารถใช้เป็นตัวอักษรสุดท้ายของรูปแบบเท่านั้น
/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]+/ ตรงกับสตริงเลขฐาน 16
[^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)"

กำหนดให้สตริงเป็น 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"