Используйте это руководство, чтобы понять распространенные уязвимости в конфигурациях Cloud Firestore Security Rules , просмотреть и лучше защитить собственные правила, а также протестировать свои изменения перед их развертыванием.
Если вы получили предупреждение о том, что ваша база данных Cloud Firestore не защищена должным образом, вы можете устранить уязвимости, изменив и протестировав Cloud Firestore Security Rules .
Чтобы просмотреть существующие правила безопасности, перейдите на вкладку «Правила» в консоли Firebase .
Поймите Cloud Firestore Security Rules
Cloud Firestore Security Rules защищают ваши данные от злоумышленников. Правила по умолчанию для любого экземпляра Cloud Firestore , созданного в консоли Firebase , запрещают доступ всем пользователям. Чтобы разработать приложение и получить доступ к базе данных, вам потребуется изменить эти правила и рассмотреть возможность предоставления полного доступа всем пользователям в среде разработки. Однако перед развертыванием приложения в рабочей среде уделите время правильной настройке правил и защите данных.
При разработке приложения и тестировании различных конфигураций правил используйте эмулятор Cloud Firestore для запуска приложения в локальной среде разработки.
Распространенные сценарии с небезопасными правилами
Перед развертыванием приложения следует пересмотреть и обновить Cloud Firestore Security Rules которые вы могли настроить по умолчанию или которые вы использовали при разработке приложения в Cloud Firestore . Убедитесь, что вы надёжно защищаете данные пользователей, избегая следующих распространённых ошибок.
Открытый доступ
При настройке Cloud Firestore вы, возможно, установили правила, разрешающие открытый доступ во время разработки. Вы можете думать, что вы единственный пользователь вашего приложения, но если вы его развернули, оно доступно в интернете. Если вы не аутентифицируете пользователей и не настраиваете правила безопасности, любой, кто угадает ваш идентификатор проекта, сможет украсть, изменить или удалить данные.
Не рекомендуется: доступ на чтение и запись для всех пользователей. |
// Allow read/write access to all users under any conditions // Warning: **NEVER** use this rule set in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
Решение: Правила, ограничивающие доступ на чтение и запись. Создавайте правила, соответствующие вашей иерархии данных. Одним из распространённых решений этой проблемы безопасности является защита на уровне пользователей с помощью Firebase Authentication . Узнайте больше об аутентификации пользователей с помощью правил . |
Только владелец контента
service cloud.firestore { match /databases/{database}/documents { // Allow only authenticated content owners access match /some_collection/{document} { // Allow reads and deletion if the current user owns the existing document allow read, delete: if request.auth.uid == resource.data.author_uid; // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; } } }
Смешанный публичный и частный доступ
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { // Allow public reads allow read: if true // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; // Allow deletion if the current user owns the existing document allow delete: if request.auth.uid == resource.data.author_uid; } } }
Доступ для любого аутентифицированного пользователя
Иногда Cloud Firestore Security Rules проверяют, вошёл ли пользователь в систему, но не ограничивают доступ на основе этой аутентификации. Если одно из ваших правил включает auth != null
, подтвердите, что хотите, чтобы любой вошедший в систему пользователь имел доступ к данным.
Не рекомендуется: любой вошедший в систему пользователь имеет право на чтение и запись всей вашей базы данных. |
service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth != null; } } }
Решение: Ограничить доступ с помощью условий безопасности. При проверке аутентификации вы также можете использовать одно из свойств аутентификации, чтобы дополнительно ограничить доступ определённых пользователей к определённым наборам данных. Подробнее о добавлении условий безопасности и ролевом доступе … |
Ролевой доступ
service cloud.firestore { match /databases/{database}/documents { // Assign roles to all users and refine access based on user roles match /some_collection/{document} { allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader" allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer" // Note: Checking for roles in your database using `get` (as in the code // above) or `exists` carry standard charges for read operations. } } }
Доступ на основе атрибутов
// Give each user in your database a particular attribute // and set it to true/false // Then, use that attribute to grant access to subsets of data // For example, an "admin" attribute set // to "true" grants write access to data service cloud.firestore { match /databases/{database}/documents { match /collection/{document} { allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; allow read: true; } } }
Смешанный публичный и частный доступ
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { allow read: if true allow write: if request.auth.uid == request.resource.data.author_uid } } }
Доступ для непроверенных адресов электронной почты
Иногда Cloud Firestore Security Rules проверяют принадлежность адреса электронной почты пользователя определённому домену. Хотя это, как правило, является хорошей практикой, адреса электронной почты не всегда проверяются при входе в систему, пока пользователь не выполнит дополнительные действия после получения проверочного письма. Убедитесь, что вы подтверждаете, что адрес электронной почты действительно принадлежит пользователю.
Не рекомендуется: любой пользователь может войти, используя произвольный адрес электронной почты. |
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email.endsWith('@example.com') } } }
Решение: ограничить доступ только проверенными адресами электронной почты. |
Проверить электронную почту
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email_verified && request.auth.email.endsWith('@example.com') } } }
Закрытый доступ
Другой распространённый подход при разработке приложения — сохранение данных в тайне. Обычно это означает, что вы закрываете доступ на чтение и запись для всех пользователей следующим образом:
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Пакеты Firebase Admin SDK и Cloud Functions по-прежнему смогут получать доступ к вашей базе данных. Используйте эти правила, если вы планируете использовать Cloud Firestore в качестве серверной платформы совместно с Firebase Admin SDK. Несмотря на безопасность, вам следует проверить, смогут ли клиенты вашего приложения корректно извлекать данные.
Дополнительную информацию о Cloud Firestore Security Rules и о том, как они работают, можно найти в статье Начало работы с Cloud Firestore Security Rules .
Проверьте Cloud Firestore Security Rules
Чтобы проверить поведение приложения и настройки Cloud Firestore Security Rules , используйте эмулятор Cloud Firestore . Используйте эмулятор Cloud Firestore для запуска и автоматизации модульных тестов в локальной среде перед внесением каких-либо изменений.
Для быстрой проверки обновленных Cloud Firestore Security Rules в консоли Firebase используйте инструмент Rules Playground.
- Чтобы открыть площадку правил, нажмите «Площадка правил» на вкладке «Правила» .
- В настройках игровой площадки «Правила» выберите параметры для вашего теста, в том числе:
- Тестирование чтения или записи
- Определенное местоположение в вашей базе данных, как путь
- Тип аутентификации — неаутентифицированный, аутентифицированный анонимный пользователь или определенный идентификатор пользователя
- Данные, специфичные для документа, на которые ссылаются ваши правила (например, если ваши правила требуют наличия определенного поля перед разрешением записи)
- Нажмите «Выполнить» и найдите результаты на баннере над окном правил.