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

时间:2018-02-02 23:22:58

标签: 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);
}

如果客户可以&#34;模拟&#34;应该使用AppEngine和REST-Interface实现服务器端安全逻辑来更改数据库或直接使用数据库是正确和安全的方式吗?或者是否有任何特定的解决方案可以保护Firebase中的数据库安全?感谢。

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

1 个答案:

答案 0 :(得分:2)

有一个security rules language for the Firebase Database,可让您描述数据的验证和访问规则。有了正确的规则,这可以和您自己编写的任何服务器端代码一样安全。

例如,使用您共享的代码段,您需要:

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

Firebase documentationmany previous question on the topic中涵盖了此类规则以及更多规则。

您可以在这些安全规则中执行高级操作。例如,我看到有人验证国际象棋动作,而其他人在这些规则中建立了一个安全的玩家对玩家买/卖系统。

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