首页 > 解决方案 > Firebase 使用 Socket.IO 从客户端安全地向服务器发送请求?

问题描述

我了解安全规则是保护数据的最安全方法,但它不支持我在用户单击特定元素时存储用户数据的方法。这是因为如果我将 write == true 设为 true,他们就可以自愿更改数据库,而我不希望他们这样做;我只是想私下记录他们从我的网站上输入的内容。

因此,我的解决方案是在服务器上创建另一个数据库。在 server.js 文件上初始化 firebase 实时数据库。我认为这将是理想的,因为客户端无法访问任何凭据(是的,我知道,即使用户确实拥有它,它也不是那么糟糕,但以防万一)。

因此,如果我要使用 socket.io 向客户端请求(他们看到的只是“socket.emit('value', 'value')),那么这不是安全的,因为他们没有看到任何与 firebase 相关的内容数据库,因为它都在服务器上(未向用户显示)?

我只想澄清这是否安全和理想,因为如果我忽略安全规则,它似乎在逻辑上有效。

向在我之前的帖子中回复的之前的用户道歉,这可能非常相似,但我已经详细说明了一点,以使我正在做的事情更清楚一点。

感谢你的帮助。

客户代码:

var a = 0;

socket.emit('value', a);

服务器代码:

firebase.initializeApp({
        apiKey: VALUE,
        authDomain: VALUE,
        databaseURL: VALUE,
        projectId: VALUE,
        storageBucket: VALUE,
        messagingSenderId: VALUE,
        appId: VALUE,
        measurementId: VALUE
});

socket.on('value', function(data) {
  var ref = firebase.database().ref('node');
  ref.set(data);
})

标签: node.jsfirebaseherokufirebase-realtime-databasefirebase-authentication

解决方案


您共享的代码确实似乎(与您的第一个问题不同)不再向调用者公开您的 Firebase 项目的身份。因此,调用者无法根据您共享的内容确定数据库 URL。

这是否足以满足您的需求,只有您可以确定。但有几点要记住:

  • 如果用户可以通过其他方式找到数据库 URL,您的".read": true, ".write": true规则仍然允许他们读取所有数据并写入任何他们想要的内容。
  • 您的代码允许将用户想要的任何内容写入数据库。您需要在代码中或使用 Firebase 的服务器端安全规则将其锁定。

推荐阅读