Как я могу защитить свою базу данных Firestore от нежелательного доступа?

# #javascript #firebase #google-cloud-firestore #firebase-security

Вопрос:

Я использую Firebase Firestore для хранения списка транзакций в коллекции под названием transactions .

Я использую react для получения транзакции из коллекции, используя URL-адрес с идентификатором документа транзакции: http://myurl.com/h1kj54h2jk35h

 const id = match.params.id;
firebase.firestore().collection('transactions').doc(id).get()
 

Таким же образом я создаю новый документ. У меня нет аутентификации на базе firebase.

Как я могу защитить свои правила Firestore:

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /transactions/{id} {
      allow read, write;
    }
  }
}
 

Если я не разрешу запись, я не смогу создавать новые транзакции.
Если я не разрешу чтение, я не смогу прочитать транзакцию, но я не хочу разрешать чтение всех транзакций. Только один раз, когда идентификатор из URL действителен.

Таким образом, я ищу способ защитить свою базу данных от нежелательного создания документов и нежелательного чтения документов.

Ответ №1:

Я думаю, вы ищете то, что называется детализированными операциями. По этой ссылке:

В некоторых ситуациях полезно разбить чтение и запись на более детализированные операции. Например, ваше приложение может захотеть применить другие условия при создании документа, чем при удалении документа. Или вы можете разрешить чтение одного документа, но запретить большие запросы.

read Правило может быть разбито на get и list , в то время write как правило может быть разбито на create , update , и delete .

Поэтому, если вы хотите разрешить только создание новых документов и получение документа, для которого пользователь должен знать идентификатор, это будет:

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /transactions/{id} {
      allow create, get;
    }
  }
}
 

Комментарии:

1. {id} Говорит ли заполнитель, что действителен только этот идентификатор? Я думал, что это заполнитель для любого документа внутри transactions . Это write также было бы нормально, если бы я хотел иметь возможность обновлять документ, когда в URL указан правильный id адрес? это безопасно для нежелательных записей?

2. А, понятно. Как я понял, {id} это просто заполнитель для любого документа. get Указывает, чтобы получить только один документ, который я прошу. Хотя list это не разрешено, запустить a curl -X GET "https://firestore.googleapis.com/v1beta1/projects/test-375f8/databases/(default)/documents/transactions" для просмотра базы данных невозможно. я прав?

3. Это немного зависит от того, какие учетные curl данные использует этот запрос для доступа к базе данных. Но любой доступ, который попадает в правила безопасности, сможет создавать только новые транзакции или получать конкретную транзакцию, идентификатор которой он уже знает с помощью этих правил.

4. Вы бы защитили такие конфиденциальные данные?