HTML5 游戏如何反作弊?

2016-01-07 13:03:58 +08:00
 falcon05
HTML5 游戏,可能会有这样的需求,比如游戏结束要将用户的得分提交到后台,之后会形成一个积分榜。因为 html5 游戏整个运行实际是在客户端,所以必须写个 ajax 来向后端服务器提交数据,参数是得分和用户 id 。但是恶意用户稍有开发知识也可以不老老实实玩游戏,直接通过这个请求地址去提交任意的得分和用户 id 。这不就乱套了吗?我就想问问对这方面大家有什么好的想法没有。
7899 次点击
所在节点    问与答
26 条回复
Bryan0Z
2016-01-07 13:14:10 +08:00
把接口藏好点,发现异常直接封?
刚刚想了半天没想到好方法
des
2016-01-07 13:20:36 +08:00
记录用户操作和点击, 后台分析. 顺带加个密,虽然没什么用
ferock
2016-01-07 13:36:35 +08:00
为什么运算逻辑是在客户端的?这个结你解不开,永远没辙

就算不是 h5 的那些传统游戏,逻辑也不会放在客户端。
nigelvon
2016-01-07 13:40:11 +08:00
每到一个阶段提交的时候会有个额外的数据,后台做验证,如果他没玩到对应的分数是没法知道这个额外的数据的。
思路这样,然后可以增加复杂度,比如这个额外数据是服务器下发的 key 做的特定算法 hash 。
falcon05
2016-01-07 13:57:14 +08:00
@ferock @nigelvon 感谢地,我说一句具体场景,比如说一个小游戏,规定时间内计算用户点击屏幕次数,如果这个计算逻辑放服务端,不说性能,就算捕捉每次用户点击就向服务器发送一个请求,用户还是可以模拟提交的呀
ferock
2016-01-07 14:58:21 +08:00
@falcon05 这个产品是谁设计的?如果改成服务器计数,那就是 DDOS 攻击服务器,客户端计数就是扯淡。

所以,这个思路。。。。 udp 包丢给服务端,让服务端处理,也可以。但是服务器要足够强劲,或者均衡要做好。反正这不是一个简单的事
yeyeye
2016-01-07 15:09:14 +08:00
行为判定吧 以前玩游戏 发现唯独是行为判定是很难躲过的
wate
2016-01-07 15:11:07 +08:00
永远不相信客户端的数据
Cloudee
2016-01-07 15:25:48 +08:00
每次点击的时间戳和位置坐标记录下来,发总成绩的时候打包一起发给服务器。
然后每多少次点击发给服务器一次请求。服务器汇总上面的数据判断有没有作弊

配合严格的封号体系,以及封号绝对不说明理由
应该可以撑一段时间不被破解……吧
Cloudee
2016-01-07 15:26:11 +08:00
@Cloudee 不过具体的算法估计比较复杂。。。
sunjourney
2016-01-07 15:37:05 +08:00
记录用户操作吧,拿 2048 举例,网页前后和服务器后台采用一样的随机数生成器与业务逻辑,用户玩的时候后台发个 seed ,前台用这个 seed 迭代或自增产成随机块,记录用户的操作,提交的时候把 seed 和用户操作一起发送给服务器,服务器模拟游戏获得成绩。能 fake scores 但不能 fake operations 。
falcon05
2016-01-07 16:12:56 +08:00
@sunjourney 谢谢,深受启发
maomaomao001
2016-01-07 16:25:10 +08:00
@sunjourney 这样也太能增加服务器的负担了~~~
我觉得吧,应该提高人员素质,要么就做成,网站注册需要钱(10~100)内,然后,只要发现有一个游戏作弊,就永久封号~~~ 这样应该可以更好的管理了,你永远都不可能 阻止一些人作弊,~~所以这种方式,我觉得这样可以很大程度上减少他们作弊行为...
sunjourney
2016-01-07 16:30:36 +08:00
@maomaomao001 看游戏多复杂,计算是否影响性能了,毕竟后台不需要界面只要跑一遍逻辑,像 2048 ,俄罗斯方块,哪怕水果忍者这种,还是容易实现的。
Slienc7
2016-01-07 17:05:37 +08:00
复杂化分数提交接口;
然后丑化页面 JS 文件(参考谷歌首页,让人没有分析的兴趣)。
paradoxs
2016-01-07 17:07:04 +08:00
关键位置插入加密随机数做捆绑检验
murusu
2016-01-07 17:22:06 +08:00
逻辑在客户端的话基本无解
补救的措施只能是记录操作,后台对高分榜的用户进行延后重演,对不上的再处理
go2sleep
2016-01-07 17:29:07 +08:00
一个想法,
1. 可以把客户的操作记录发回服务器;
2. 在服务器端,使用 Phantom.js 之类的东西,把你的 Html5 游戏运行一遍,把客户端传来的操作记录作为输入
3. 查看运行完成的结果是否和客户端的一致。

这样做的好处是,服务器端验证方便,直接可以使用客户端的 html5 代码

PS. 如果你是用了 WebGL 的,可能 Phantom.js 不支持。
go2sleep
2016-01-07 17:29:51 +08:00
不过“按键精灵”类的作弊应该不好避免……
bdnet
2016-01-07 19:19:07 +08:00
状态机? 必须按特定的组合完成游戏

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

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

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

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

© 2021 V2EX