Firebase 보안 규칙 정규 표현식

정규 표현식 리터럴은 클라이언트 제공 문자열의 유효성을 검사하는 데 사용할 수 있습니다. string.matches(/pattern/)를 사용하여 문자열이 정규 표현식 패턴을 준수하는지 테스트합니다. 정규 표현식 구문은 일반적인 정규 표현식 구문과 동일하지 않으며 특히 다음과 같은 특징이 있습니다.

  • * + . ( ) [ ] { } \은(는) 정상적으로 작동합니다.
  • ^$ 앵커는 패턴의 첫 번째 또는 마지막 문자와 일치시키기 위해 사용하는 경우에만 작동합니다.
  • i (대소문자 무시) 특수키 플래그만 지원됩니다.

리터럴

정규 표현식 리터럴은 /pattern/ 표기법을 사용하여 보안 표현식에 사용됩니다. 문자열이 정규 표현식 패턴을 준수하는지 테스트하려면 문자열의 match 멤버 함수를 사용합니다. 다음 일치 규칙은 새 데이터가 문자열 foo로 시작하는지 여부를 확인합니다.

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

지원되는 기능

Firebase는 일반적인 정규 표현식 기능의 일부만 지원합니다. 정규 표현식 문법이 익숙할 것입니다.

지원되는 기호는 다음과 같습니다.

문자 기반이란 의미
\s \w \d \S \W \D 공백, 단어 문자 또는 숫자와 그 부정을 매칭하기 위한 사전 정의된 문자 집합 (각각)
\ 이스케이프 문자 다음에 오는 문자는 문자 그대로 해석됩니다.
""에서 일치시키려면 그 자체도 이스케이프 처리 /\/
^ 문자열의 시작 부분에 고정합니다. 패턴의 첫 글자로만 사용할 수 있습니다.
/a/는 'ba'와 일치하지만 /^a/은 일치하지 않습니다.
$ 앵커에 추가합니다. 패턴의 마지막 문자로만 사용할 수 있습니다.
/a/ 'ab'와 일치하지만 /a$/은 일치하지 않습니다.
* 선행 패턴과 0개 이상과 일치합니다.
/^a*$/이(가) ""과(와) 일치합니다. 'aaa' 및 'b' 제외
+ 앞의 패턴 중 하나 이상과 일치합니다.
/^a+$/이(가) 'a'와 일치합니다. 및 'aaa'는 사용할 수 있지만 ''는 제외
? 앞의 패턴 중 0개 또는 1개와 일치합니다.
/^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의 정규 표현식 일치는 일치를 감지할 수만 있고 문자열의 일부를 캡처할 수 없으므로 탐욕스럽지도 탐욕하지도 않습니다.

용도

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