Как я могу безопасно разрешить всем пользователям чтение и авторизацию для записи в приложение с Firebase Realtime Database?

#swift #firebase #firebase-realtime-database #firebase-authentication #firebase-security

# #swift #огневая база #firebase-realtime-database #firebase-аутентификация #firebase-безопасность

Вопрос:

Я создаю приложение для социальных сетей, в котором любой может прочитать, что происходит, но должен войти в систему, чтобы взаимодействовать с каждым сообщением. Я хотел бы найти способ, позволяющий всем моим пользователям делать это без небезопасной базы данных. Я почти закончил разработку и в настоящее время пытаюсь кое-что исправить.

Для моих текущих правил установлено значение true для целей разработки:

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

Я попробовал несколько правил

1.

 {
  "rules": {
      "$uid": {
        ".read": true,
        ".write": "auth.uid == $uid"
      }
  }
}
 

Который позволяет всем читать, но не разрешает запись из-за разрешений.

2)

 {
  "rules": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
  }
}
 

Что не позволяет никому читать или записывать из-за разрешений.

3.

 {
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}
 

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

Вот пример, который вызывает ошибку отказано в разрешении:

A) Когда пользователь нажимает кнопку отправки нового объявления, вызывается эта функция.

  StorageService.sendAnnouncementDataToDatabase(photoUrl: "", announcementComment: announcementComment, ratio: CGFloat(0), onSuccess: {
ProgressHUD.showSuccess("SWEET")
})
 

Б) Внутри функции sendAnnouncementDataToDatabase

         let ref = Ref().databaseAnnouncements
        let newAnnouncementID = ref.childByAutoId().key ?? ""
        let newAnnouncementReference = ref.child(newAnnouncementID)
        guard let currentUser = Api.User.CURRENT_USER  else {
            return
        }
  
        var dict = ["userId" : currentUserId, "photoUrl" : photoUrl]
        
        newAnnouncementReference.setValue(dict, withCompletionBlock: {(error,ref) in
// permission denied occurs here
})
 

Я прочитал много документов и задал вопрос. А также попытался установить правила для каждого пути. Тот же результат.

Любые идеи были бы полезны. Спасибо.

Комментарии:

1. Ваши правила безопасности должны разрешать доступ к данным, который необходим вашему коду, но запрещать любой другой доступ к данным. Эти правила довольно общие, поэтому разрешают / запрещают в общем виде. Если вы хотите защитить шаблоны доступа к данным вашего приложения, покажите код для операции, которая должна быть разрешена, и для операции, которая должна быть запрещена.

2. @FrankvanPuffelen Я понимаю, что вы говорите. Когда пользователь находится в приложении, ему действительно негде увидеть чьи-либо другие данные. Тем не менее, я надеялся, что существует общий способ просто обеспечить правильный доступ для всех. Я обновлю свой пост

3. Ваш код не соответствует правилам в # 2, которые являются наиболее безопасными из того, чем вы поделились. Если вы хотите контролировать доступ к определенному пользователю, вам необходимо использовать UID этого пользователя в пути к этим данным.

4. @FrankvanPuffelen Мне кажется, я понимаю, о чем вы говорите. Эта таблица называется просто объявления. Значит, мне нужно было бы иметь объявления на моем пути, а затем конкретный uid?

Ответ №1:

Если это реальная цель

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

тогда это сделает это

 {
  "rules": {
    ".read": true,
    ".write": "auth != null"
  }
}
 

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

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

Комментарии:

1. На самом деле я тоже пробовал это делать. Это было по основным правилам документации firebase. Я все еще получаю ту же небезопасную проблему в своей почте. Вариант использования — просто разрешить пользователям размещать сообщения в ленте новостей, комментировать сообщения других пользователей и информировать всю ленту новостей. Поэтому я подумал, что предложенного вами решения было достаточно. Это просто небезопасно

2. @XavierJamesShelton Это решение вопроса. Однако вы по-прежнему будете получать небезопасные сообщения электронной почты, поскольку любой может прочитать ВСЕ данные во всей вашей базе данных, что может быть или может быть проблемой, но любой, кто создает учетную запись и / или проходит аутентификацию, также может ЗАПИСЫВАТЬ любые данные. Это означает, что любой пользователь может, например, подделать другого пользователя и опубликовать поддельное сообщение. Не уверен, имеет ли это значение в вашем случае использования, но это возможно.

3. Что ж, я думаю, это помогло Я считаю, что последний комментарий, который вы сказали, — это то, что мне действительно нужно было понять. У меня много встроенной безопасности, поэтому, честно говоря, пока никто не может в принципе взломать мою базу данных, чтобы иметь возможность читать все, что я в порядке. Спасибо.