Firestore 데이터 검증

prepsheets.com의 경우 Firebase와 Typescript를 사용합니다. 처음에는 형식 안전성을 극단적으로 택했습니다. runtypes을 사용하여 앱에 들어오는 모든 데이터의 유효성을 검사하고 데이터베이스에 스키마를 적용하는 Firestore 보안 규칙이 있습니다. 이것은 다소 성가시지만 데이터베이스에서 어떤 데이터가 끝나는지 확신할 수 있으므로 최종 긍정적이라고 생각합니다.


첫 번째 단계는 유효한 필드 이름만 제출되도록 하는 것입니다(사용자가 많은 양의 임의 데이터를 저장하지 못하도록 하기 위해)

function incomingData() {
   return request.resource.data;
}

function onlyHasAttrs(attrs){
   return incomingData().keys().hasOnly(attrs);
}

match /users/{userId} {
    allow create: if onlyHasAttrs(['name', 'email', 'picture', 'age']);
}


이것은 목록에서 hasOnly 함수를 사용합니다. IncomingData의 모든 키가 attrs에 있는지 확인합니다.


다음으로 필드가 올바른 유형이 아닌지 확인합니다. 이것은 stringsnumbers에 쉽습니다.

function hasValidSchema() {
    return (
        onlyHasAttrs(['name', 'email', 'picture', 'age']) &&
        incomingData().name is string &&
        incomingData().name.size() > 0 &&
        incomingData().age is number
    );
}

allow create: if hasValidSchema();



불행히도 listsmaps 에서는 상황이 더 복잡합니다. 필드가 유형list 또는 map인지 확인할 수는 있지만 해당 개체의 구성원을 확인할 수는 없습니다. 또는 최소한 임의의 수를 확인할 수 없습니다. 참조: https://stackoverflow.com/a/58257828/3949864 . 분명히 Firebase 팀은 filing a feature request 까지 목록 유형 안전성을 더 빨리 얻을 수 있도록 이 문제를 조사하고 있습니다.
map 속성의 경우에만 속성을 비어 있도록 설정하거나 업데이트할 수 있습니다. Cloud Functions를 사용하여 실제로 데이터를 설정하고 실행 유형으로 전달된 모든 항목을 검증합니다.

function hasValidMap() {
    return (
        incomingData().map is map &&
        incomingData().map.size() == 0 ||
        incomingData().map == existingData().map
    );
}

lists의 경우 Cloud Functions를 사용하여 데이터를 설정하거나 최대 길이를 부과합니다. 예를 들어 사용자가 자신의 관심사를 나열할 수 있지만 사용자는 5개만 나열할 수 있다고 가정합니다. 그런 다음 보안 규칙에서 다음을 사용할 수 있습니다.

function hasValidInterests(interests) {
    return (
        interests is list &&
        (interests.size() < 1 || interests[0] is string) &&
        (interests.size() < 2 || interests[1] is string) &&
        (interests.size() < 3 || interests[2] is string) &&
        (interests.size() < 4 || interests[3] is string) &&
        (interests.size() < 5 || interests[4] is string) &&
        (interests.size() < 6)
    );
}

좋은 웹페이지 즐겨찾기