Правила безопасности Firestore без аутентификации - PullRequest
0 голосов
/ 18 октября 2019

Я храню данные в базе данных Cloud Firestore. Пользователям в моем приложении не нужно создавать учетную запись для получения данных, и они также могут записывать данные без входа в систему.

Google каждые несколько дней напоминает мне, что моя база данных небезопасна и может быть использована кем-либо. Как я могу улучшить его, не обращаясь к переменным Auth?

Мои правила Firebase

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

Есть ли способ сделать мою базу данных более безопасной, не используя аутентификацию?

Логика моего приложения:

Моя база данных содержит фамилии и их происхождение. Если кто-то вводит имя, он возвращает источник из базы данных. Пример: "Доу" -> "Мексиканец". Если фамилия не существует в моей базе данных, я вызываю API и сохраняю значение в моей базе данных. Каждому пользователю необходимо разрешение на чтение и запись.

Что я могу сделать здесь?

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

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

То, что вы описываете для своего приложения прямо сейчас, слишком расплывчатос хорошими правилами. Честно говоря, без Аутентификации Firebase невозможно принимать записи в базу данных без Аутентификации , а также избегать злоупотреблений, поскольку любой может писать что угодно из любого места в Интернете. Это также может стоить вам больших денег, если кто-то обнаружит вашу «открытую» базу данных.

2 голосов
/ 18 октября 2019

Поскольку операция, для которой требуется запись, ограничена (только вставка новых элементов), у вас есть несколько вариантов:

  • Вы можете запретить запись для клиентов конечного пользователя и вместо этого отправить запрос в облакофункция, которая выполняет именно ту операцию, которая вам нужна (после проверки ввода или любых других проверок, которые вам могут потребоваться, ограничение скорости и т. д.). Облачные функции игнорируют правила безопасности, поскольку они запускаются с административным доступом.

Вот пример функции узла, который выполняет запись в базу данных в реальном времени, и он успешно выполняется, когда и чтение, и запись ложны в безопасностиправила (ваш связанный package.json, очевидно, должен зависеть от firebase-admin и firebase-functions):

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

let db = admin.firestore();

// This pushes the "text" parameter into the RDB path /messages/(hash)/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
    // Grab the text parameter.
    const original = req.query.text;
    // Push the new message into the Realtime Database using the Firebase Admin SDK.
    const snapshot = await admin.database().ref('/messages').push({original: original});
    // Respond to the user (could also be a redirect).
    res.send('got it: ' + snapshot.ref.toString());
  });

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

  • Используя язык правил , вы можете разрешить только операции создания. Это устраняет возможность клиента обновлять или удалять существующие данные. Это не так безопасно, как предыдущий метод, но может подойти вам:
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow create;
    }
  }
}

Кроме того, обратите внимание, что это работает для firestore (который вы используете), но не для базы данных в реальном времени.

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

1 голос
/ 18 октября 2019

Ознакомьтесь с этой документацией. https://firebase.google.com/docs/firestore/security/rules-structure. Настройте запись неаутентифицированных пользователей только в указанных вами коллекциях.

service cloud.firestore {
  match /databases/{database}/documents {

    // authentication required
    function issignedin() {
      return request.auth != null;
    }

    // authentication not required
    function notAuthenticated() {
      return request.auth == null;
    }

    // A read rule can be divided into get and list rules
    match /cities/{city} {
      // Applies to single document read requests
      allow get: if notAuthenticated();

      // Applies to queries and collection read requests
      allow list: if notAuthenticated();
    }

    // A write rule can be divided into create, update, and delete rules
    match /cities/{city} {
      // Applies to writes to nonexistent documents
      allow create: if notAuthenticated();

      // Applies to writes to existing documents
      allow update: if notAuthenticated();

      // Applies to delete operations
      allow delete: if notAuthenticated();
    }
  }
}

в качестве соображения, это будет небезопасно, если вызывающий API разрешает запись без разбора. Примечание. Если API, на который вы ссылаетесь, является единственным, который вы можете написать, вы должны настроить только чтение как общедоступное

service cloud.firestore {
  match /databases/{database}/documents {

    // authentication required
    function issignedin() {
      return request.auth != null;
    }

    // authentication not required
    function notAuthenticated() {
      return request.auth == null;
    }

    // A read rule can be divided into get and list rules
    match /cities/{city} {
      // Applies to single document read requests
      allow get: if notAuthenticated();

      // Applies to queries and collection read requests
      allow list: if notAuthenticated();
    }

    // A write rule can be divided into create, update, and delete rules
    match /cities/{city} {
      // Applies to writes to nonexistent documents
      allow create: if issignedin();

      // Applies to writes to existing documents
      allow update: if issignedin();

      // Applies to delete operations
      allow delete: if issignedin();
    }
  }
}

...