Правило безопасности firebase, позволяющее администраторам читать / писать всем остальным пользователям, создает брешь в безопасности? - PullRequest
0 голосов
/ 12 февраля 2020

Я использую облачную базу данных Firestore, и у меня есть коллекция 'users' в моей базе данных root, и в ней находятся все пользовательские документы (называемые uid) и внутри них собираемые мной данные. Я хотел, чтобы пользователи могли только читать / писать в свои коллекции, поэтому я начал свои правила безопасности с

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /users/{userId}/{documents=**} {
      allow read, write: if request.auth.uid == userId
    }
  }
}

, после чего я понял, что пользователи не имеют разрешения создать свой собственный основной документ (он создал его как «призрачный» документ). Я также хочу добавить к нему данные, такие как отображаемое имя и адрес электронной почты, поэтому я добавил

// Allow users to read/write their own main user object
match /users/{userId} {
  allow read, write: if request.auth.uid == userId
}

, все работает хорошо, но теперь я хочу разрешить администраторам читать / записывать все коллекции и документы пользователя. Документация Firebase предлагает добавить значение ключа к документу пользователя, например (admin:true), поэтому редактирование моих правил безопасности должно быть таким же:

match /users/{userId}/{documents=**} {
  allow read, write: if request.auth.uid == userId
  allow read, write: if get(/users/$(request.auth.uid)).data.admin == true; //-security breach?
}

, но не делает этого создает брешь в системе безопасности, когда пользователь может технически обновить свой собственный документ с помощью (admin:true) и получить права администратора? если да, то я предполагаю, что мой подход должен создать отдельную коллекцию admins и добавить туда моих администраторов, а затем сделать что-то в строках

allow read, write: if get(/admins/$(request.auth.uid)) != null

? или я могу использовать что-нибудь красивее?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Это правило действительно позволит кому-либо помечать себя как Администратора, побеждая всю цель ваших правил:

allow read, write: if get(/users/$(request.auth.uid)).data.admin == true;

Что вы хотите сделать, это:

  • Либо предоставьте пользователям-администраторам пользовательскую admin: true претензию , которую затем вы можете проверить в своих правилах с помощью: allow read, write: if auth.token.admin === true;
  • . Сохраните явный список UID для ваших администраторов в ваши правила безопасности, а затем проверьте это в каждом правиле. Итак: allow read, write: if isAdmin();, а затем function isAdmin(request) { return request.auth.uid == "KqEizsqUQ6XMkUgLUpNxFnzLm4F3" }.
  • Сохраните список UID администраторов в другой (обычно не записываемой) коллекции в Firestore и проверьте это. Это в значительной степени то, что вы описали, и это наиболее распространенный подход, если вы хотите быстро и легко добавлять / удалять администраторов.
0 голосов
/ 07 апреля 2020

Просто чтобы уточнить, если вы собираетесь использовать get (), вам нужно указать полный путь. Так что в вашем случае это будет:

allow read: if get(/databases/$(database)/documents/admins/$(request.auth.uid)).data.admin == true

Подробнее об этом можно прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...