排行榜怎么防止恶意用户刷榜?

2022-01-06 08:39:49 +08:00
 jsdi
业务需求是前端有一个网页小游戏,通过小游戏会获得一个分数,这个分数要提交到后端进行排序返回小游戏的分数排行榜。如何不使用复杂的加密算法简单的实现这个需求呢?

刚开始是用 base64 编码,不至于那么裸奔。后来导师让我用 referer 请求头实现,只有是公司域名才能访问此接口。但是 google 发现 referer 也是可以伪造的,而且使用 referer 测试好像没法单独进行接口测试。

请问真的可以使用 referer 实现吗?有没有其他实现方式呢?
4399 次点击
所在节点    问与答
35 条回复
murmur
2022-01-06 08:42:16 +08:00
这不就是反外挂技术么,肯定得是边玩边追踪的,大概就是给开发人员一个更宽松的条件,让他在上帝模式下打出一个分数,然后以这个分数为基准,超过这个分数离谱的就得人工去核算了

现在还没看到一个完全自动化反外挂的方案
murmur
2022-01-06 08:43:44 +08:00
当然这种方式也比不上玩家的脑洞,原神不就是各种叠 buff 搞伤害竞赛,最高都叠到 700w 了,所以官方干脆锁了伤害上限
stormer
2022-01-06 08:44:50 +08:00
纯前端提交的,你只能用 js 写个校验算法,然后要对 js 进行层层加密,这个只能防菜鸟,高手没用

没其他方式了...所有校验前端提交的方式只能说增加伪造门槛, 不过你可以后端自己伪造分数, 让自己人排 1/2/3 名,哈哈哈
mineralsalt
2022-01-06 08:46:21 +08:00
先考虑这个游戏有没有人玩吧
jsdi
2022-01-06 08:50:37 +08:00
@murmur 安全可靠的好像就只有非对称加密可以实现,但又感觉没必要太复杂哈哈
jsdi
2022-01-06 08:51:11 +08:00
@mineralsalt 哈哈哈应该还是有人玩的
jsdi
2022-01-06 08:51:52 +08:00
@stormer 确实 设置一个上限是最简单的
tomczhen
2022-01-06 08:53:41 +08:00
领奖条件加一条:要求获奖用户直播打一次,得分至少要到获奖分数的 75%。
:doge:
Rheinmetal
2022-01-06 09:10:50 +08:00
上传操作和随机种子 看看人能否 fuxian
排行榜延迟显示 人工审核
boringcc
2022-01-06 09:19:21 +08:00
要求游玩的人一边录屏摄手打
oppoic
2022-01-06 09:24:13 +08:00
微信授权登录之后才可以玩,刷榜的碰到这种的基本就折腾了
loading
2022-01-06 09:43:52 +08:00
微信绑定登陆,必须点一个广告再说。
Celebi
2022-01-06 09:59:50 +08:00
交 5 元查看排行
wu67
2022-01-06 10:19:11 +08:00
没必要. 这种通常情况下是把游戏难度搞难一点, 然后开发的时候页面仔直接就能给你玩出极限分数了. 超出这个的基本上都难, 要么开挂, 要么是赌脸那种寿命玩法. 榜爱怎么排就怎么排, 反正统计是需要服务器资源和时间的, 你觉得不对, 那就按前面测出的极限分数, 让后台把超过这个分数太多的给 ban 了...
by 一个曾经切过几个活动页面游戏的前端仔.
yancy0l
2022-01-06 10:20:01 +08:00
既然是导师的实现方案,那可能不是商业化的东西,只是产品功能需要。看了描述应该是担心 通信报文有明文数据被修改,那用加密算法挺合适的,非对称加密,完美解决问题,而且也不是特别麻烦,一般网上有 Demo 。 这样实现,更合理一些,别为了解决安全问题,去绕弯子。
leafre
2022-01-06 10:23:16 +08:00
除非把逻辑放在服务端实现,否则只能增加破解难度
jackzhengjbs
2022-01-06 10:32:58 +08:00
啥游戏啊?我的八门神器已经饥渴难耐了
Mutoo
2022-01-06 10:38:36 +08:00
游戏可以实现录制功能,将客户端版本、玩家每帧操作和随机数种子记录下来,高分玩家分数与记录一并提交,后端可以用一个 headless 模拟器快速重放游戏过程,看看分数是否一致即可。
libook
2022-01-06 10:47:09 +08:00
referer 没用,可以伪造。

计分机制、加密秘钥、加密算法都放到 wasm 里,有了最终分数后用对称加密发送到服务端,服务端解密记录排序返回排行榜。

为了避免重放请求攻击,需要在加密的时候加个时间戳,这样即便分数相同加密后的密文也会不一样,服务端解密后判断时间戳是不是在过去一定时间范围内。

以上这么处理之后,再想刷榜就只能逆向 wasm 代码,或者从游戏玩法上面做一些外挂。
jsdi
2022-01-06 10:58:29 +08:00
说得很好,下次别说了[:doge]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/826487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX