Понимание правил безопасности базы данных Firebase Realtime

Правила безопасности базы данных Firebase Realtime определяют, кто имеет доступ для чтения и записи к вашей базе данных, как структурированы ваши данные и какие индексы существуют. Эти правила живут на серверах Firebase и постоянно применяются автоматически. Каждый запрос на чтение и запись будет выполнен только в том случае, если ваши правила это позволяют. По умолчанию ваши правила не разрешают никому доступ к вашей базе данных. Это необходимо для защиты вашей базы данных от злоупотреблений, пока у вас не будет времени настроить правила или настроить аутентификацию.

Правила безопасности базы данных в реальном времени имеют синтаксис, подобный JavaScript, и бывают четырех типов:

Типы правил
.читать Описывает, разрешено ли пользователям читать данные и когда это возможно.
.писать Описывает, разрешена ли запись данных и когда это возможно.
.валидатировать Определяет, как будет выглядеть правильно отформатированное значение, есть ли у него дочерние атрибуты и тип данных.
.indexOn Указывает дочерний элемент для индексирования для поддержки упорядочивания и выполнения запросов.

Обзор безопасности Realtime Database

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

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

Аутентификация

Обычным первым шагом в обеспечении безопасности вашего приложения является идентификация пользователей. Этот процесс называется аутентификацией . Вы можете использовать аутентификацию Firebase , чтобы пользователи могли входить в ваше приложение. Аутентификация Firebase включает в себя поддержку распространенных методов аутентификации, таких как Google и Facebook, а также вход по электронной почте и паролю, анонимный вход и многое другое.

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

Авторизация

Идентификация пользователя — это только часть безопасности. Как только вы узнаете, кто они, вам понадобится способ контролировать их доступ к данным в вашей базе данных. Правила безопасности базы данных в реальном времени позволяют контролировать доступ для каждого пользователя. Например, вот набор правил безопасности, который позволяет любому читать путь /foo/ , но никому не писать по нему:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Правила .read и .write каскадируются, поэтому этот набор правил предоставляет доступ для чтения к любым данным по пути /foo/ а также к любым более глубоким путям, таким как /foo/bar/baz . Обратите внимание, что более мелкие правила .read и .write в базе данных переопределяют более глубокие правила, поэтому доступ для чтения к /foo/bar/baz все равно будет предоставлен в этом примере, даже если правило по пути /foo/bar/baz будет оценено как false.

Правила безопасности базы данных реального времени включают встроенные переменные и функции, которые позволяют вам ссылаться на другие пути, временные метки на стороне сервера, информацию аутентификации и многое другое. Вот пример правила, которое предоставляет доступ на запись для аутентифицированных пользователей к /users/<uid>/ , где <uid> — это идентификатор пользователя, полученный с помощью Firebase Authentication .

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Проверка данных

Firebase Realtime Database не имеет схемы. Это позволяет легко вносить изменения по мере разработки, но как только ваше приложение будет готово к распространению, важно, чтобы данные оставались согласованными. Язык правил включает правило .validate , которое позволяет применять логику проверки с использованием тех же выражений, которые используются для правил .read и .write . Единственное отличие состоит в том, что правила проверки не являются каскадными , поэтому все соответствующие правила проверки должны иметь значение true, чтобы запись была разрешена.

Эти правила требуют, чтобы данные, записываемые в /foo/ были строкой длиной менее 100 символов:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Правила проверки имеют доступ ко всем тем же встроенным функциям и переменным, что и правила .read и .write . Вы можете использовать их для создания правил проверки, которые учитывают данные в других местах вашей базы данных, личность вашего пользователя, время сервера и многое другое.

Определение индексов базы данных

Firebase Realtime Database позволяет упорядочивать и запрашивать данные. Для небольших размеров данных база данных поддерживает специальные запросы, поэтому индексы во время разработки обычно не требуются. Однако перед запуском приложения важно указать индексы для любых запросов, которые вам нужны, чтобы гарантировать, что они продолжат работать по мере роста вашего приложения.

Индексы указываются с использованием правила .indexOn . Вот пример объявления индекса, который будет индексировать поля высоты и длины для списка динозавров:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Следующие шаги