استفاده از عبارات منظم در قوانین امنیتی پایگاه داده بلادرنگ

می‌توان از عبارات با قاعده برای اعتبارسنجی رشته‌های ارائه شده توسط کلاینت استفاده کرد. برای بررسی اینکه آیا یک رشته از الگوی عبارت با قاعده پیروی می‌کند یا خیر، از string.matches(/pattern/) استفاده کنید. سینتکس عبارت با قاعده با سینتکس عبارات با قاعده رایج یکسان نیست، به ویژه:

  • * + . ( ) [ ] { } \ طبق معمول کار می‌کند.
  • لنگرهای ^ و $ فقط در صورتی کار می‌کنند که از آنها برای تطبیق اولین یا آخرین کاراکتر در الگو استفاده کنیم.
  • فقط پرچم اصلاح‌کننده i (نادیده گرفتن حروف بزرگ و کوچک) پشتیبانی می‌شود

حروف

یک عبارت منظم با استفاده از نماد /pattern/ به یک عبارت امنیتی معرفی می‌شود. برای بررسی اینکه آیا یک رشته از الگوی عبارت منظم پیروی می‌کند یا خیر، از تابع عضو matches از رشته string استفاده کنید. قانون matches زیر بررسی می‌کند که آیا داده‌های جدید با رشته foo شروع می‌شوند یا خیر.

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

ویژگی‌های پشتیبانی‌شده

فایربیس فقط از زیرمجموعه‌ای از ویژگی‌های معمول عبارات منظم پشتیبانی می‌کند. با این حال، سینتکس عبارات منظم باید آشنا به نظر برسد.

نمادهای پشتیبانی شده عبارتند از:

شخصیت معنی
\s \w \d \S \W \D مجموعه کاراکترهای از پیش تعریف شده برای تطبیق فضای خالی، یک کاراکتر کلمه یا یک رقم، و نفی آنها (به ترتیب)
\ فرار، شخصیت زیر به معنای واقعی کلمه تفسیر می‌شود.
اگر می‌خواهید روی خود "" هم تطبیق دهید، از آن هم escape کنید /\/
^ به ابتدای رشته متصل می‌شود. این فقط می‌تواند به عنوان حرف اول الگو استفاده شود.
/a/ ‎ با "ba" مطابقت دارد، در حالی که /^a/ ‎ اینطور نیست.
$ به انتهای رشته متصل می‌شود. این فقط می‌تواند به عنوان آخرین حرف الگو استفاده شود.
/a/ ‎ با "ab" مطابقت دارد، در حالی که /a$/ ‎ اینطور نیست.
* با صفر یا تعداد زیادی از الگوهای قبلی مطابقت دارد.
/^a*$/ ‎ با ‎""‎ و ‎"aaa"‎ مطابقت دارد، اما با ‎"b"‎ مطابقت ندارد.
+ با یک یا چند الگوی قبلی مطابقت دارد.
/^a+$/ ‎ با ‎"a"‎ و ‎"aaa"‎ مطابقت دارد، اما با ‎""‎ مطابقت ندارد.
? با صفر یا یک از الگوی قبلی مطابقت دارد.
/^a?$/ ‎ با ‎""‎ و ‎"a"‎ مطابقت دارد، اما با ‎"aa"‎ مطابقت ندارد.
. با هر کاراکتری مطابقت دارد
/......../ با "فایربیس" مطابقت دارد
(pattern) پرانتز یک الگو را در یک واحد گروه‌بندی می‌کند
/(ab)*/ ‎ با "abab" مطابقت دارد.
a|b با a یا b مطابقت دارد
/a|bc/ ‎ با ‎"ac"‎ یا ‎"bc"‎ مطابقت دارد.
[akz] یک مجموعه کاراکتر، با هر یک از کاراکترهای موجود مطابقت دارد.
/[ABCDEF]/ ‎ فقط با حروف بزرگ از A تا F مطابقت دارد.
[az] یک فاصله کاراکتری، با تمام کاراکترهای موجود در محدوده مشخص شده مطابقت دارد.
/[0-9A-F]+/ ‎ با رشته‌های هگزادسیمال مطابقت دارد
[^0-9] یک ^ مقدم، مجموعه کاراکترها را منفی می‌کند و هر چیزی غیر از مجموعه کاراکتر مشخص شده را تطبیق می‌دهد.

یک i که بعد از ساختار تحت‌اللفظی عبارت منظم (مثلاً /yes/i ) قرار می‌گیرد، نشان می‌دهد که تطبیق به حروف کوچک و بزرگ حساس نخواهد بود. سایر اصلاح‌کننده‌های عبارت منظم در حال حاضر پشتیبانی نمی‌شوند.

تطبیق عبارت منظم در قوانین امنیتی پایگاه داده Realtime Firebase نه حریصانه است و نه غیر حریصانه، زیرا فقط به شما امکان می‌دهد یک تطابق را تشخیص دهید و بخش‌هایی از رشته را ضبط نکنید.

کاربرد

رشته‌ای را انتخاب کنید که تاریخ با فرمت 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"