我正在探索 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);
}
如果客户端可以被“模拟”或被黑客攻击等怎么办。是否应该使用带有 REST 接口(interface)的 AppEngine,它实现服务器端安全逻辑来更改数据库或直接使用数据库是正确且安全的方法?或者是否有任何特定的解决方案可以保证 Firebase 中数据库的安全?谢谢。
文档页面:https://firebase.google.com/docs/database/unity/save-data
最佳答案
有一个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 产品(例如实时数据库)完美集成。
关于javascript - 火力基地。授予客户端直接写入服务器上数据库的访问权限是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48592271/