Правила Firebase, разрешающие запись, когда этого делать не следует

У меня есть следующая запись в базе данных: «компании: 8»: введите здесь описание изображения

У меня есть следующие правила базы данных, которые не позволяют имитировать запись «компаний: 8» в базу данных.

{
  "rules": {
      ".read": "auth != null",
      ".write": "auth != null",
        "companies": {  
              ".validate": "(data.exists() && (newData.val() === data.val() + 1)) || (!data.exists() && newData.val() == 0)" 
        }
  }
}

введите здесь описание изображения

Однако, когда я пытаюсь записать «companies: 20» в базу данных с помощью Firebase Python SDK, что также не разрешено этими правилами, это работает:

In [1]: import firebase_admin

In [2]: from firebase_admin import credentials, db

In [3]: cred = credentials.Certificate('serviceAccountCredentials_dev_async.json
   ...: ')

In [4]: firebase_admin.initialize_app(cred, {'databaseURL': 'https://async-testi
   ...: ng.firebaseio.com/'})
Out[4]: <firebase_admin.App at 0x7fc50c00c080>

In [5]: ref = db.reference()

In [6]: ref.update({'companies': 20})

Что я делаю не так?




Ответы (1)


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

Если есть причина, по которой вы должны использовать Admin SDK и выполнять правила проверки, аутентифицироваться с ограниченными правами:

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

person Bob Snyder    schedule 29.07.2017
comment
Хороший улов, Боб! - person Frank van Puffelen; 29.07.2017