실시간 데이터베이스 보안 규칙에서 정규 표현식 사용

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

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

리터럴

정규 표현식 리터럴은 /pattern/ 표기법을 사용하여 보안 표현식에 도입됩니다. 문자열이 정규 표현식 패턴을 준수하는지 테스트하려면 문자열의 matches 멤버 함수를 사용합니다. 다음 matches 규칙은 새 데이터가 문자열 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?$/ 는 '' 및 '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 실시간 데이터베이스 보안 규칙의 정규 표현식 일치는 일치 항목을 감지할 수만 있고 문자열의 일부를 캡처할 수는 없으므로 탐욕적이지도 비탐욕적이지도 않습니다.

사용

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