无需身份验证的 Firestore 安全规则

ele*_*nad 8 firebase firebase-security google-cloud-firestore

我将数据存储在 Cloud Firestore 数据库中。我的应用程序中的用户不需要创建帐户来获取数据,他们也可以在不登录的情况下写入数据。

谷歌每隔几天就会提醒我,我的数据库不安全,任何人都可以滥用。如何在不访问 Auth 变量的情况下改进它?

我的火力点规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用身份验证的情况下使我的数据库更安全?

我的应用程序的逻辑:

我的数据库包含姓氏及其起源。如果有人输入姓名,他会从数据库中取回原名。示例:“Doe”->“墨西哥”。如果我的数据库中不存在姓氏,我会调用 API 并将值保存到我的数据库中。每个用户都需要读写权限。

我能在这里做什么?

rob*_*emb 6

由于您需要写入的操作是有限的(仅插入新项目),您有一些选择:

  • 您可以拒绝对最终用户客户端的写入,而是将请求发送到执行您需要的操作的云函数(在验证输入或您可能需要的任何其他检查、速率限制等之后)。云函数在使用管理访问权限运行时会忽略安全规则。

这是一个执行实时数据库写入的示例节点函数,当安全规则中的 read 和 write 都为 false 时它会成功(您关联的 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());
  });
Run Code Online (Sandbox Code Playgroud)

您可能想了解 firebase admin SDK 如何进行访问控制,但在云功能中,默认情况下您应该拥有管理员权限。

  • 使用规则语言,您只能允许创建操作。这消除了客户端更新或删除现有数据的能力。这不像之前的方法那么安全,但对你来说可能没问题:
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow create;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意这适用于 firestore(您正在使用),但不适用于实时数据库。

显然,这两种方法都可能以某种方式被滥用以将大量数据写入您的数据库,尽管前者可以让您更好地控制允许的内容(例如,您可以防止超过 N 个条目,或每个条目超过 Y 个字节)。后者仍然允许任何人创建他们想要的任何内容。


Dou*_*son 6

首先是从文档开始。强烈建议您了解规则的作用,并将其转化为应用程序的要求。

您现在为您的应用程序描述的内容太模糊,无法制定良好的规则。老实说,如果没有 Firebase 身份验证,就不可能在没有身份验证的情况下接受对数据库的写入,也无法避免滥用,因为任何人都可以从互联网上的任何地方写入任何内容。如果有人发现您的“开放”数据库,这也可能会让您损失大量金钱。