Пример:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
{
"project_info": {
"project_number": "project-number",
"project_id": "project-id",
"storage_bucket": "project-storage-bucket"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "mobilesdk_app_id",
"android_client_info": {
"package_name": "com.example.sample"
}
},
"oauth_client": [
{
"client_id": "client_id..apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "api_key"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "client_id.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
Я создаю приложение для Android, которое будет использовать Cloud Firestore. Я знаю, что злоумышленник может декомпилировать приложение и получить файл google-services.json
.
Но тогда как они узнают детали базы данных, такие как идентификатор базы данных и т. д.?
Если вы используете эти правила:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
Это означает, что вы разрешаете любому, кто знает идентификатор вашего проекта, читать/записывать в/из вашей базы данных Firestore. Что, очевидно, плохо, поскольку этим могут воспользоваться злоумышленники.
Таким образом, кто-то, кто знает только идентификатор вашего проекта, может выполнять операции записи и чтения. Это означает, что ваши счета увеличатся.
Это правда, что вы можете использовать эти настройки в течение небольшого периода времени в целях тестирования, но никогда в производственной среде. Поэтому всегда пишите правильные правила вместе с Проверка приложений Firebase, которая:
защищает ваши ресурсы API от злоупотреблений, предотвращая доступ неавторизованных клиентов к вашим серверным ресурсам.
В заголовке вашего вопроса говорится: «Как злоумышленник сможет получить доступ к моей базе данных Cloud Firestore, если я не настроил никаких правил безопасности Cloud Firestore?» Тем не менее, вопрос продолжает показывать правила, которые вы установили. Каждая база данных Firestore, созданная через консоль Firebase, имеет правила безопасности, даже если вы не установили их самостоятельно.
Ваши правила, в частности, соответствуют всем документам во всех подколекциях (match /{document=**}
) и обеспечивают полный доступ для чтения и записи ко всем этим документам (allow read, write: if true
).
Я знаю, что злоумышленник может декомпилировать приложение и получить файл google-services.json. Но тогда как они узнают детали базы данных, такие как идентификатор базы данных и т. д.?
В Firestore идентификатор базы данных по умолчанию совпадает с идентификатором вашего проекта. Этот идентификатор находится прямо в упомянутом вами файле google-service.json. В вашем поддельном примере идентификатор проекта — «project-id». После публикации вашего приложения эта информация становится общедоступной, как и все содержащиеся в нем инструкции по доступу к документам Firestore. Кто-то, владеющий вашим общедоступным исходным кодом (или просто наблюдающий за доступом вашего приложения к сети), может знать имена всех коллекций, к которым имеет доступ ваше приложение.
Используя только идентификатор проекта, названия документов и коллекции, любой может использовать Firebase SDK для воспроизведения такого доступа. Все, что им нужно сделать, — это инициализировать Firesbase SDK с тем же содержимым, что и общедоступный google-service.json. Или они могут даже использовать REST API Firestore для прямого доступа к содержимому вашей базы данных без необходимости использования какого-либо SDK.
Если вы не хотите, чтобы ваша база данных была полностью общедоступной, вам придется потратить время на интеграцию инструментов безопасности, таких как аутентификация Firebase, проверка приложений Firebase, а также хорошие правила безопасности, которые ограничивают доступ к базе данных только аутентифицированным пользователям, которым необходимо иметь доступ.
Спасибо за ваш ответ! еще один вопрос, а что если я создам базу данных (т. е. не буду использовать базу по умолчанию)? будет ли тогда достаточно только идентификатора проекта, чтобы злоумышленник получил доступ?
Любой злоумышленник сможет получить информацию из вашего публичного кода и конфигурации для доступа к базе данных. Неважно, какая комбинация информации потребуется — они все смогут их увидеть. Невозможно скрыть необходимую информацию, если логика вашей базы данных находится в самом приложении. Единственный способ скрыть эти данные — вообще не помещать их в приложение, а вместо этого заставить его проходить через серверную часть, выполняющую запросы. На этом этапе вам необходима безопасность вашей серверной конечной точки. Безопасность – это сложно.
Если я знаю идентификатор вашего проекта, я могу сделать то же, что и вы, поскольку вы являетесь владельцем проекта. Ваша база данных общедоступна для всех в мире. Операции чтения и записи можно выполнять с помощью одного из доступных SDK для Интернета или мобильных устройств или с помощью REST API Cloud Firestore.