# #android #firebase #google-cloud-firestore #firebase-security
Вопрос:
Я хочу проверить, являются ли имя пользователя и номер телефона уникальными. Я реализовал его с помощью FirebaseFirestore.getInstance().collection("Users").whereEqualTo("phone",ph).get().addOnCompleteListener(...);
Это мое правило firestore:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: true;
allow write: if request.auth.uid != null;
}
match /Users/{userID} {
allow update: if request.auth.uid == userID
amp;amp; (request.resource.data.username == resource.data.username
|| isUserNameAvailable(request.resource.data.username)
);
}
}
Код отлично работает без каких-либо проблем. Я проверяю это перед signInWithCredential
методом, и, следовательно, request.auth.uid всегда будет равен нулю. Чтобы заставить код работать, я должен сохранить allow read: true;
Но теперь я получаю это предупреждение
Мы обнаружили следующие проблемы с вашими правилами безопасности: любой пользователь может прочитать всю вашу базу данных
Есть ли какой-либо обходной путь, чтобы предотвратить это?
Ответ №1:
Это распространенная ошибка разработчиков при использовании usernames
. Вы дали кому-либо разрешение на чтение всей вашей базы данных. И даже если вам удастся сделать это только для чтения Users
, любой может прочитать все данные ваших пользователей.
Я бы рекомендовал удалить первый allow read:true
и написать правила для каждого пути так, как они должны быть. Также создайте отдельный collection
раздел только для имен пользователей и сохраните их все там, как /usernames/${username}
и /phones/${phone}
. Если вам нужно спастись вместе, вы можете это сделать.
Таким образом, вы можете очень легко проверить без каких-либо запросов, существует ли a username
или phone
, просто проверив, существует ли этот путь в вашей базе данных.
Вы можете очень легко синхронизировать users
коллекцию с этими двумя и даже написать правила безопасности, которые запрещают создавать пользователей в коллекции username
, которые уже существуют в коллекции имен пользователей.