Javascript 如何从chrome扩展或Tampermonkey扩展保护Firebase实时数据库?

Javascript 如何从chrome扩展或Tampermonkey扩展保护Firebase实时数据库?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,任何知道如何在Tampermonkey扩展中编写脚本或如何创建扩展的人都可以轻松地在网页中插入javascript代码并访问配置键。那么你如何确保它的安全呢 var config = { apiKey: "apiKey", authDomain: "projectId.firebaseapp.com", databaseURL: "https://databaseName.firebaseio.com", storageBucket: "bucket.appspo

任何知道如何在Tampermonkey扩展中编写脚本或如何创建扩展的人都可以轻松地在网页中插入javascript代码并访问配置键。那么你如何确保它的安全呢

var config = {
    apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com",
    storageBucket: "bucket.appspot.com"
};
firebase.initializeApp(config);
现在我唯一能想到的就是用匿名函数包装,以避免全局变量的可访问性。它可以阻止访问变量

它仍然是不安全的,开发人员可以使用正则表达式ajax javascript文件和解析数据,所以如何防止它

我想到的另一件事是使用nodejs作为后端,并使用restapi获取数据,但它也排除了实时数据库。此外,如果firebase在后端实时更新数据库,我必须使用socket.io将数据实时传输到客户端

因为,若任何人可以注入脚本来访问配置键,那个么在授予读写权限的地方,他也可以随意读写数据库中的任何地方。
这是一个安全问题。客户机上的任何可用密钥都是有风险的。那么如何防止这种攻击呢?

这是一个相当常见的问题。答案是:不,客户机不能从数据库中的任何地方进行写和读,只能在您的规则允许的情况下进行

这与REST完全一样,如果您有一个RESTAPI,那么您的所有端点都是公共的。防止恶意使用的是服务器规则

在这种情况下,数据库规则负责保护和验证数据

最简单的规则是用户登录:

Items: {
    .read: if auth != null, 
   .write: if auth != null
}
您还可以有更常见的规则,如所有者权限

user_items: {
   $uid: {
         .read: if auth.uid == $uid, 
        .write: if auth.uid == $uid  
   }
}
前面的示例考虑了一个数据结构,其中每个用户都有自己的节点,但如果出于任何原因,您希望将其全部保留在同一个节点中,则可以使用。我的建议是使用上述结构,这样在将来,可以通过对数据进行非规范化来添加管理功能


这里的区别是,如果您查看您的凭据,您将公开它们。Firebase没有真正的私有数据,只需要将请求与您的项目相匹配的数据,除此之外,您的项目还必须定义安全性。请注意保护RTD、Firestore和存储。

更新答案。我建议您阅读关于规则的文档,尤其是关于数据结构的文档,这似乎是最初的概念。这不是一个SQL(表)数据库,所有“动物”可以或不可以在同一个地方,甚至可以在多个地方,如果需要的话。如果您确实确定这一点,那么您应该进行一些道德黑客攻击,创建您所说内容的POC并将其发送给Firebase,我已经联系了支持人员,他们非常响应@FaizanRupani,只需添加我的2美分@FaizanRupani。。。注入脚本,可能是使用用户浏览器上的第三方系统,或者使用受损路由器,都会使其“不安全”。您担心的是,在同一个域上运行的注入的泄露代码现在可能会对数据库造成损害,就像当前登录的用户一样。我想我们在这里忘记的是,注入的泄露代码也会对安全的api点造成损害,因为来自泄露代码的请求也会导致使用相同的cookie或jwt进行身份验证(请记住,黑客可以调查并最终访问内存中的jwt,或者只使用根据请求自动发送的会话cookie)。因此,如果你在一个安全的api上做这件事,也不会有什么不同。鉴于此,现在的问题不在于Firebase,而在于你如何保护你的网站甚至你的浏览器。在你的网站上注入代码(如中间人攻击或妥协路由器)是非常困难的,如果你正在使用HTTPS…默认情况下,firebase上的主机通过https发送您的网站。如果你在自己的服务器上托管,那么你就有责任添加https。