防止欺诈性提交到记分板

时间:2009-03-23 16:53:37

标签: hash flash checksum database-security

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

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

目前我正在思考这个问题

  1. 用户玩游戏并点击提交他们的分数
  2. 在后台,横幅将分数和原始域发送到主站点上的脚本。
  3. 脚本检查域是托管广告的有效域之一。
  4. 如果一切正常,脚本会创建此分数和域的哈希值,并将其与分数一起存储在数据库中。
  5. 该脚本将哈希值返回给Flash,它将其拼接到打开主记分板的getURL的查询字符串
  6. 记分板页面检查引用程序以确保它是有效域之一。
  7. 如果是,则检查数据库中是否有哈希值,如果它是有效令牌
  8. 然后用户填写他们的详细信息,并根据哈希值更新记录
  9. 上次我检查FLash不发送引用信息,这有点投入扳手进入我的计划。那么,这种Flash /数据库交互是否已经建立了模式?

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

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

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

    谢谢, 格雷格

2 个答案:

答案 0 :(得分:2)

基本上你不想验证分数是来自合法的客户,你要验证客户端实际上是在玩游戏来达到分数。基本上你可以期待的最好的是人们被要求创建一个AI来玩游戏。

您可以尝试以下几种方法:

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

答案 1 :(得分:1)

我之前曾在游戏行业工作过,并且沿着这些方向做了些什么。据我所知,没有人打扰过分数提交部分。

它的做法是:

  1. 生成一个随机数作为盐(来自闪存)
  2. 根据盐(来自闪光灯)
  3. ,使用数学运算对乐谱进行编码
  4. 添加校验和以确保乐谱(来自闪光灯)没有回火
  5. 将分数和所有必需的数据发送到分数提交页面
  6. 在服务器上,使用校验和验证分数是否已经过调整
  7. 如果分数有效,则将其插入数据库,否则拒绝
  8. 如果您愿意,您可能会记录违反校验和的分数提交者的IP地址(可能是三个错误校验和的政策,您已经出局)并添加一个脚本以禁止他们访问服务器1小时,但是这样除非有人想破解你的代码,否则可能不会被要求。
  9. 注意:  散列/校验是使用自定义函数进行的。不需要非常安全的东西。它是使用盐和分数计算得出的。一些简单的数学运算,如求和,乘法和减法。


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

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

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

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

    现在对于校验和,我们假设你想要一个 253 的值作为校验和。
    你加上你的加密分数的所有数字7 + 9 + 3 + 2 + 3 + 3 + 2 + 6 + 5 = 40

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

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

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

    在得分服务器上,您可以将 793233265 除以 134789 ,并提供 5885 ,并使用与之前相同的功能验证校验和。

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

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