我在探索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
答案 0 :(得分:2)
有一个security rules language for the Firebase Database,可让您描述数据的验证和访问规则。有了正确的规则,这可以和您自己编写的任何服务器端代码一样安全。
例如,使用您共享的代码段,您需要:
/scores/$key
和/user-scores/$uid/$key
的值是否相同。$uid
。Firebase documentation和many previous question on the topic中涵盖了此类规则以及更多规则。
您可以在这些安全规则中执行高级操作。例如,我看到有人验证国际象棋动作,而其他人在这些规则中建立了一个安全的玩家对玩家买/卖系统。
但是,编写此类规则的容忍度因开发人员而异。许多开发人员更习惯于在命令式代码中执行此类(验证和访问)逻辑,在这种情况下使用自定义服务器端代码也很好。如果这是您的偏好,我建议您查看Cloud Functions for Firebase,这样可以轻松实现,并与许多Firebase产品(例如实时数据库)很好地集成。