防止向记分板提交欺诈性内容
-
21-08-2019 - |
题
我正在开发 Flash 游戏的后端,我需要 安全的 数据进入记分板。
该游戏将在许多网站上以横幅广告形式托管,用户将在广告中玩游戏,然后点击进入主网站以保存其详细信息。
目前我正在思考这个问题
- 用户玩游戏并点击提交分数
- 在后台,横幅将分数和原始域发送到主站点上的脚本。
- 该脚本检查域是否是托管广告的有效域之一。
- 如果一切正常,脚本会创建此分数和域的哈希值,并将其与分数一起存储在数据库中。
- 该脚本将哈希值返回给 Flash,Flash 将其拼凑到打开主记分板的 getURL 的查询字符串上
- 记分板页面会检查引荐来源网址以确保它是有效域之一。
- 如果是,则检查数据库中的哈希值是否是有效令牌
- 然后,用户填写他们的详细信息,并根据哈希值更新记录
上次我检查 FLash 没有发送引用信息,这有点破坏了我的计划。那么,这种 Flash/数据库交互是否已经建立了模式?
在步骤 4 中我应该使用哪种哈希/校验和?这种操作的正确名称是什么,是哈希、校验和还是其他什么?
我知道,作为一种客户端技术,Flash 实际上永远不会那么安全,但在我看来,像上面这样的事情与破解此类应用程序一样困难。
更新:我的主要目标是让人们更难找到将分数添加到数据库的脚本的 URL,并简单地向其发送虚假分数。
谢谢,格雷格
解决方案
我之前在游戏行业工作过,也做过类似的事情。据我所知,没有人费心去破解分数提交部分。
完成的方式是:
- 生成一个随机数作为盐(来自闪存)
- 基于盐(来自闪存)使用数学运算对分数进行编码
- 添加校验和以确保分数没有被修改(来自闪存)
- 将分数和任何所需数据发送到分数提交页面
- 在服务器上,使用校验和验证分数是否未被修改
- 如果分数有效,则将其插入数据库,否则拒绝它
- 如果你愿意,你可以记录违反校验和的分数提交者的 IP 地址(也许是三个错误校验和的策略,你就出局了)并添加一个脚本来禁止他们访问服务器 1 小时,但这可能不会除非有人那么想破解你的代码,否则是必需的。
笔记 :散列/校验和是使用自定义函数进行的。不需要非常安全的东西。它是通过对盐和分数的计算而得出的。一些简单的数学运算,如求和、乘法和减法。
编辑:校验和的简单算法/数学
假设您的用户得分为 5885.
您生成一个随机数作为盐 134789 (长度不变,用0填充)
加密分数 = 分数 * 盐 (你应该在这里使用更复杂的东西,但这只是一个例子)
在我们的示例中,加密分数为: 793233265
现在对于校验和,假设您想要的值为 253 作为校验和。
您将加密分数的所有数字相加 7+9+3+2+3+3+2+6+5 = 40
现在,您计算该分数的校验和值
253 -(加密分数的总和% 253)
现在,我们有以下数字:
盐= 134789
加密分数 = 793233265
校验和 = 40
您向服务器发出请求,发送 134789793233265040 作为分数。
在分数服务器上,您可以划分 793233265 经过 134789 给予 5885 并使用与之前相同的函数验证校验和。
如果校验和失败,则数字已被篡改。
你可能最终会得到更安全的东西,但它应该可以解决问题。
其他提示
本质上,您不想验证分数是否来自合法客户端,您想验证客户端是否确实玩过游戏以获得分数。从本质上讲,你所能期望的最好的结果就是人们被要求创建一个人工智能来玩游戏。
您可以尝试以下几件事:
- 将输入记录到游戏中并将其与分数一起发送。然后服务器可以验证分数是否对应于可能的游戏。您还可以通过这种方式检测重复提交。
- 应用速率限制来阻止客户以明显不人道的速度提交分数。根据实际可能达到的分数应用允许分数的上限,并根据每秒操作数等设置下限。
- 使用之前的输入来部分播种伪随机数生成器(假设您使用一个)。这使得客户不太可能稍微改变提交并仍然获得有效的游戏/得分组合。