3

所以说我要实现一个拼字游戏,我希望它是 100% 的客户端,即主干处理所有游戏逻辑。是否有可能保护这样的解决方案,使用户无法欺骗游戏动作?

这可能吗?

4

2 回答 2

3

我认为有几件事必须留在服务器端,即使在(几乎)全客户端解决方案中

  1. 安全性 - 您必须在客户端之外进行某种授权和身份验证
  2. 验证- 您永远不能信任用户生成的内容,并且在主干同步期间发送到服务器的 JSON 模型在某种程度上是用户生成的内容(因为任何人都可以打开控制台并弄乱您的模型并保存)

我知道像Firebase这样的解决方案可以很好地处理 #1,但我不确定它们是否能处理 #2

因此,在这种情况下,Sébastien 的回答是一个很好的解决方案,而不是服务器验证,您让对等方根据他们对游戏的表示来验证他们从其他对等方获得的内容是有效的移动。但是,你怎么知道谁是对的?多数人获胜?我看不出有一种方法可以避免出现某种服务器端状态,即“主”状态,并验证每次移动都是“有效”移动。

一种方法是让你的服务器端在 Node.js 上运行,这样你就可以避免在两个不同的地方重写你的验证逻辑。您不需要在服务器端运行整个逻辑,只需验证部分即可。

还有一些方法可以在服务器端运行整个 Backbone 应用程序(例如这种方法),但我不确定这里是否需要这样做。

您需要服务器端验证的其他几个原因:您如何知道用户正在保存什么?例如,如果您没有大小限制,是什么阻止他们将整个盗版电子书数据库存储在您的应用程序中,如果您在服务器端没有验证,那么理论上任何拥有控制台的人都可以推送任何内容。

于 2013-04-05T00:25:41.297 回答
2

这是不可能的,除非您还为一个客户端构建了一种方式来告诉另一个客户端停止作弊,或者换句话说,在本地验证每一步。但是,这具有相反的问题,即允许作弊者阻止对手的一举一动。

您可以通过让第三个人与客户“间接观察”比赛来扩展这一点,并提供关于移动的第三个观点。如果三分之二的人认为此举合法,则通过。只有当你有大量的作弊者/人修改脚本时,这才会崩溃。

我认为这将是您唯一的解决方案之一,因为如果应用程序完全是客户端的,您就不能认为代码中的任何内容都是安全或牢不可破的。我认为,您需要更多地依赖对等验证,而不是在代码中构建检查。

于 2013-04-05T00:17:40.953 回答