Как запретить доступ к базе данных Firebase Realtime из консоли браузера? - PullRequest
2 голосов
/ 03 мая 2020

У меня есть JavaScript код, где пользователи входят в мое приложение, используя свою учетную запись Google.

//firebase db congifurations
const config = {
  apiKey: "my_api_key",
  authDomain: "my-app.firebaseapp.com",
  projectId: "my-app",
  databaseURL: "https://my-app.firebaseio.com",
};

//signin callback implemented using - https://developers.google.com/identity/sign-in/web/sign-in
function onSignIn(googleUser) {
  var profile = googleUser.getBasicProfile();

  let fullName = profile.getName().split(" "); 
  let userName = profile.getEmail().replace(/@.*$/, "");

  if (!firebase.apps.length) {
    firebase.initializeApp(config);
  }
  this.database = firebase.database();

  let userRef = this.database.ref("users/" + userName);
  userRef.set({
    firstName: fullName[0],
    lastName: fullName[1],
    displayPicture: profile.getImageUrl(),
  });
}

Когда я выполняю этот код, установите отладчик на let userRef = this.database.ref("users/" + userName); и попробуйте запустить его на консоли:

 userRef.set({
    firstName: "Clutch",
    lastName: "Prince",
    displayPicture: "any_url_that_i_want_to_inject",
  });

Этот код выполняется и моя база данных подвергается воздействию. Есть ли безопасный способ сделать это?

Мои правила базы данных в реальном времени:

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

1 Ответ

2 голосов
/ 03 мая 2020

Правила Firebase являются наиболее важной частью. Никто, кроме вас, не может их редактировать. Поэтому убедитесь, что они в безопасности. У вас есть .write: true означает, что любой может написать вашу базу данных. Чтобы предотвратить это, вы должны иметь безопасные правила. Вы можете проверить эту ссылку для большинства комбинаций правил.

Рассматривая свою проблему, установите правила следующим образом:

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

Убедитесь, что вы храните все данные пользователей в разных узлах. Сохраните значение узла в качестве их UID. Тогда вышеприведенные правила должны быть под рукой ?

Теперь пользователи могут редактировать или читать только свою информацию. Даже если они попытаются отредактировать его через консоль, по крайней мере вы сохраните безопасность других. Если это игра, обязательно go вперед и добавьте штраф, если вы заметите их XD.

Это по-прежнему позволяет пользователям редактировать по крайней мере свою информацию, как указано ранее. Так что в случае, если вы храните какую-то игровую статистику и сколько ресурсов имеет игрок, вам нужно заблокировать доступ на запись, выполнив это: ".write": false

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

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

export const onNewuserJoined = functions.auth.user().onCreate((user) => {
    const newUserUID = user.uid
    const newUserEmail = user.email

    return Promise.all([
    admin.database().ref(player_stats_path).set({ "Level": initLevel, "Cash": initCash}),
    admin.database().ref(player_info_path).set({ "UID": newUserUID, "E-Mail": newUserEmail})
    ])
})

Теперь эти player_stats_path и player_info_path будут иметь доступ только на чтение, поэтому никто не может связываться с ним, кроме облачных функций, таких как OVERRIDE любые правила присутствуют. Если вам нужно изменить статистику кого-либо, когда он выполняет определенную задачу или около того, вам нужно будет сделать это только с помощью облачных функций. Приятно иметь весь игровой код в бэкенде.

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