【问题标题】:Firebase Sending Request to Server from Client Safe Using Socket.IO?Firebase 使用 Socket.IO 从客户端安全地向服务器发送请求?
【发布时间】:2020-09-11 14:17:44
【问题描述】:

我了解安全规则是保护数据的最安全方式,但它不支持我在用户点击特定元素时存储用户数据的方法。这是因为如果我将 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);
})

【问题讨论】:

  • 我不清楚。所以你是说你只希望客户端从数据库中读取一些值而不是写入?
  • 请记住,firebase 是可读写的。因此,当用户单击按钮时,它会使用套接字向服务器发送请求(如果已创建 firebase init)以与数据库进行交互。因此,我假设用户无法更改 firebase 数据库,因为它都在服务器上?因此,允许读和写是真的可以吗?希望这有点道理,我正在做一些非常奇怪但合理的事情。
  • 如果你的安全规则允许读写,那么任何人都可以修改数据。 仅在您的服务器上执行此操作这一事实并不意味着其他人无法从他们想要的任何位置执行此操作。但是,如果您不从客户端写入,则客户端可能不知道数据库 URL,这为您提供了一种隐匿安全的形式。但是,如果不看看你是如何实现的,就不可能说出任何确定的东西。
  • 但是如果他们没有关于数据库的信息(所有数据都隐藏在服务器上),他们如何访问数据库?任何人都可以读写,没错,但他们不知道数据库url,apikey,什么都没有。他们可以更改数据库的唯一方法是登录我的 firebase 帐户,这很困难。我是否错过了另一种客户端用户访问我的 firebase 数据库的方法?很抱歉有任何混淆。
  • 在这一点上,我们需要看到一个最小的实现来说明更多。

标签: node.js firebase heroku firebase-realtime-database firebase-authentication


【解决方案1】:

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

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

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

【讨论】:

  • 所以最终,如果我保持我的 Firebase 项目的项目 URL 安全/隐藏,那么没有人能够解决它?如果不是很麻烦,请您详细说明第二个点。你能提供一个在我的代码中锁定它的例子吗?非常感谢,这很有帮助! :D 另外,客户端用户是否可以在浏览器的控制台中使用 socket.io 命令更改数据库,还是不允许这样做?
  • 我正在努力寻找通过代码验证用户访问权限的方法。有什么建议吗?
  • 我使用heroku的环境变量难道不够安全吗?我的凭据并不完全在服务器上,它是从存储变量的 heroku 网站中提取的。所以从技术上讲,它是相当安全的,对吧?
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2019-04-23
  • 2020-07-15
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多