设计安全,“低成本”方法以确认客户端游戏结果的想法

时间:2009-05-26 21:04:58

标签: facebook security

这是一个系统设计问题/挑战,而不是编码问题。

基本上,我正在考虑使用HTML,CSS和javascript在Facebook上整合Bejeweled - esque游戏。这主要是出于通过一个非平凡的项目来学习FBJS的所有小注意事项的愿望。

所以这是交易。在为Facebook开发时,实际的API调用非常昂贵;不仅有Facebook服务器的额外POST,还有api呼叫限制和限制担心。简而言之,对Facebook的呼叫越少越好。将此与即使是这个简单的益智游戏的时间问题相结合,并且有充分的理由积极地最大限度地减少回调的数量。

不是安全专家,这是我提出的设计:

  1. 在游戏页面中嵌入随机种子。
  2. 使用该种子创建游戏板(以及根据需要添加其他部分)。
  3. 根据自上次移动以来的时间,在每个玩家移动后调整种子(xor,连接和散列,类似的东西)。编辑:我可能还应该包括改变种子的实际行动。
  4. 游戏完成后,回复以下内容:游戏开始时间,每次移动以及何时,以及客户端的结果。
  5. 在服务器上,使用给定数据重新运行游戏,检查开始时间和移动时间,然后确认结果是否匹配。
  6. 为了减少拒绝服务,游戏本身将进行调整以获得X条件的胜利。
  7. 为了阻止服务器被用作各种类型的“oracle”,发布回无效游戏的用户将被禁止一段时间X(X大约为几分钟)。
  8. 此设计需要每场比赛进行三次Facebook通话:一次用于在游戏开始前存储随机种子,一次用于在游戏结束后获取,一次用于在游戏有效时更新玩家的得分。

    我试图证明系统反对是直接得分欺骗(http://...?myscore=999999999或类似)。我还想减轻“向前看”的攻击,其中用户可以告诉接下来会有什么棋子进入棋盘。还应防止对托管服务器的攻击(有意或无意)。

    实际问题,任何人都可以看到这个设计的缺陷吗?同样,是否有更简单的设计符合我的标准?

    注意:我知道这可能是多么不必要,但这是一个有趣的问题。

    <小时/> 我打算尝试在这里添加一些数字以进一步说明我的推理,这些非常粗糙,但我希望有帮助。

    假设一个10x10游戏板,有大约200个潜在的移动(交换两个相邻的棋子),其中大多数是无效的。假设每次“转弯”平均有5次有效动作。如果我们将玩家行为限制在50到30,000毫秒的帧中,那么“调整”算法不会丢弃比特,有149,750个潜在的新哈希值;我有信心说至少有10,000个潜在的新哈希值必须由攻击者计算,假设使用了加密安全哈希。如果你在此处抛出最小 - 最大算法,你的决策树会很快爆炸。在这个游戏会话到期时,比如说30分钟,我相信这次攻击的复杂程度相当于写一个小机器人程序来为你玩,而这个程序无法合理地防范。

2 个答案:

答案 0 :(得分:3)

如果客户端代码计算下一篇文章并且你无法很好地隐藏这个算法,那么一些无聊的大学生就会想到这一点。结果,他们将能够产生大量分数并击败你的意图。

答案 1 :(得分:0)

我倾向于说这是不可能的。为什么?你不能相信客户端 - 我可以分析并完全重写客户端代码并返回我喜欢的任何值。保护您免受欺骗和各种攻击的唯一方法是在服务器上执行逻辑 - 客户端将只收集用户输入并显示服务器输出。但这完全违背了您的设计目标,以最大限度地减少服务器调用次数。