火力基地。授予客户端访问权限以直接写入服务器上的数据库是否安全?

use*_*809 0 javascript security firebase-realtime-database

我正在探索 Google Firebase。从文档中我看到他们授予客户端访问权限以直接更改服务器上的数据库......这安全吗?

private void WriteNewScore(string userId, int score)
{
    // Create new entry at /user-scores/$userid/$scoreid and at /leaderboard/$scoreid simultaneously
    string key = mDatabase.Child("scores").Push().Key;
    LeaderBoardEntry entry = new LeaderBoardEntry(userId, score);
    Dictionary<string, Object> entryValues = entry.ToDictionary();

    Dictionary<string, Object> childUpdates = new Dictionary<string, Object>();
    childUpdates["/scores/" + key] = entryValues;
    childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

    mDatabase.UpdateChildrenAsync(childUpdates);
}
Run Code Online (Sandbox Code Playgroud)

如果客户端可以被“模拟”或被黑客攻击等怎么办?应该使用带有 REST 接口的 AppEngine 来实现服务器端安全逻辑来更改数据库或直接使用数据库是正确和安全的方式吗?或者是否有任何特定的解决方案可以确保 Firebase 中的数据库安全?谢谢。

文档页面:https : //firebase.google.com/docs/database/unity/save-data

Fra*_*len 5

Firebase 数据库有一种安全规则语言,允许您描述数据的验证和访问规则。有了正确的规则,这可以像您自己编写的任何服务器端代码一样安全。

例如,对于您共享的代码片段,您需要:

  • 验证所写的分数格式是否正确,并且在预期范围内。
  • 验证/scores/$key/user-scores/$uid/$key是相同的值。
  • 保证一个用户只能在自己下写$uid

Firebase 文档许多以前关于该主题的问题中涵盖了此类规则以及更多规则。

您可以在这些安全规则中做真正高级的事情。例如,我看到有人验证国际象棋移动,还有其他人在这些规则中构建了安全的玩家对玩家买卖系统。

但是编写此类规则的容忍度因开发人员而异。许多开发人员更习惯于在命令式代码中执行此类(验证和访问)逻辑,在这种情况下,使用自定义服务器端代码也很好。如果这是您的偏好,我建议您查看Cloud Functions for Firebase,它使这变得简单并且与许多 Firebase 产品(例如实时数据库)很好地集成。