1

我正在开发 Flash 游戏的后端,我需要保护进入记分板的数据。

该游戏将在横幅广告中托管在许多网站上,用户将在广告中玩游戏,然后点击进入主站点以保存他们的详细信息。

目前我正在考虑这个问题

  1. 用户玩游戏并点击提交他们的分数
  2. 在后台,横幅将分数和原始域发送到主站点上的脚本。
  3. 脚本检查域是托管广告的有效域之一。
  4. 如果一切正常,脚本会创建此分数和域的哈希值,并将其与分数一起存储在数据库中。
  5. 该脚本将哈希返回给 Flash,Flash 将其拼凑到打开主记分板的 getURL 的查询字符串中
  6. 记分牌页面会检查引用者以确保它是有效域之一。
  7. 如果是,则检查数据库的哈希值是否是有效令牌
  8. 然后用户填写他们的详细信息并根据哈希更新记录

上次我检查 FLash 不发送推荐人信息时,这有点让我的计划陷入困境。那么,这种 Flash/Database 交互是否已经建立了模式?

我应该在第 4 步中使用哪种散列/校验和?这种操作的正确名称是什么,是哈希、校验和还是其他什么?

我知道作为一种客户端技术,Flash 永远不会真正那么安全,但在我看来,像上面这样的东西与你要破解这种应用程序一样困难。

更新:我的主要目标是让人们更难找到将分数添加到数据库的脚本的 URL,并简单地用虚假分数发送垃圾邮件。

谢谢,格雷格

4

2 回答 2

2

本质上,您不想验证分数是否来自合法客户端,您想验证客户端实际玩游戏以获得分数。从本质上讲,您可以期望的最好的结果是人们被要求创建一个 AI 来玩游戏。

您可以尝试以下几件事:

  • 将输入记录到游戏中并将其与分数一起发送。服务器然后可以验证分数对应于可能的游戏。您也可以通过这种方式检测重复提交。
  • 应用速率限制以阻止客户以明显不人道的速度提交分数。根据实际可能达到的目标对允许分数应用上限,对每秒操作数等应用下限。
  • 使用以前的输入来部分播种伪随机数生成器(假设您使用一个)。这使得客户不太可能稍微更改提交内容并仍然获得有效的游戏/分数组合。
于 2009-03-23T17:30:20.443 回答
1

我之前在游戏行业工作过,也做过类似的事情。据我所知,没有人会费心破解分数提交部分。

它的完成方式是:

  1. 生成一个随机数作为盐(来自闪存)
  2. 基于盐(来自闪存)使用数学运算对分数进行编码
  3. 添加校验和以确保乐谱上没有回火(来自闪存)
  4. 将分数和任何所需数据发送到分数提交页面
  5. 在服务器上,使用校验和验证分数没有被调和
  6. 如果分数有效,则将其插入数据库,否则,拒绝它
  7. 如果您愿意,您可以记录违反校验和的分数提交者的 IP 地址(可能是三个错误校验和的策略,您退出了)并添加一个脚本以禁止他们访问服务器 1 小时,但这可能不会除非有人想破解你的代码那么糟糕。

注意:散列/校验和是使用自定义函数进行的。不需要非常安全的东西。它是使用盐和分数的计算得出的。一些简单的数学运算,如求和、乘法和减法。


编辑:校验和的简单算法/数学

假设您的用户的得分为5885
您生成一个随机数作为134789的盐(恒定长度,用 0 填充)

cryptedScore = Score * Salt(你应该在这里使用一些更复杂的东西,但这只是一个例子)

在我们的示例中,加密分数为:793233265

现在对于校验和,假设您希望将值253作为校验和。
您将加密分数的所有数字相加 7+9+3+2+3+3+2+6+5 = 40

现在,您计算此分数
253的校验和值- (加密分数数字的总和 % 253

现在,我们有以下数字:
盐 = 134789
加密分数 = 793233265
校验和 = 40

您向服务器发出请求,发送134789793233265040作为分数。

在分数服务器上,您可以将793233265除以134789得到5885,并使用与以前相同的函数验证校验和。

如果校验和失败,则数字已被篡改。

您可能最终会得到更安全的东西,但它应该可以解决问题。

于 2009-03-23T17:46:02.107 回答