Понимание правил безопасности базы данных 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 . Единственное отличие заключается в том, что правила валидации не каскадируются , поэтому для разрешения записи все соответствующие правила валидации должны быть оценены как «истина».

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

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

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

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

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

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

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

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