V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
falcon05
V2EX  ›  问与答

HTML5 游戏如何反作弊?

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

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

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

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

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

    PS. 如果你是用了 WebGL 的,可能 Phantom.js 不支持。
    go2sleep
        19
    go2sleep  
       2016-01-07 17:29:51 +08:00
    不过“按键精灵”类的作弊应该不好避免……
    bdnet
        20
    bdnet  
       2016-01-07 19:19:07 +08:00
    状态机? 必须按特定的组合完成游戏
    klausgao
        21
    klausgao  
       2016-01-07 22:06:51 +08:00 via iPhone
    如果是微信内做的 h5 游戏,开始之前要 oauth 登录,就能限制必须在微信内运行,也就不好破解了
    temberature
        22
    temberature  
       2016-01-07 22:52:31 +08:00
    严格意义上,除非你的游戏是图灵测试的一种才能杜绝。
    m939594960
        23
    m939594960  
       2016-01-07 23:03:37 +08:00
    我感觉完全可以看看 pc 端的游戏怎么做检测
    心跳包每个心跳包返回 key 每次发包的时候根据 key 生成加密(每个包一定要设置 过期时间 而且尽量保持快点 这让做挂的人调试起来特别麻烦)
    js crc (不知道现实不) 静态 CRC + 每次请求 JS 不同加载不同动态 CRC
    点与关键数据检测 (游戏任务 /打斗 点记录 每( 10/20 )个封包时候悄悄地发送一下最近经过点(不发游戏 也不会出现任何故障 但是最后成绩提交不上 或者第二天封号))
    如果 真正想做这个反检测的话 可以看看现在世面上主流的检测比较强的游戏 的检测方法 例如地下城 天天酷跑 你会找到很多灵感的

    以上都是我瞎说的。。 我也只是想想
    m939594960
        24
    m939594960  
       2016-01-07 23:10:52 +08:00   ❤️ 1
    我仔细看了下 好像只是那种小游戏 最后要提交积分那种 上面说的话就当没看见吧
    又去看了看 43399 的小游戏 造梦西游
    http://www.4399.com/flash/78072.htm
    也是采用的 post 提交最后的积分

    verify:3094ce8651f4f54a6d7319f39885e4ff
    session:-1
    title:孙悟空
    token:
    refer:http://s8.4399.com/4399swf/upload_swf/ftp7/hanbao/20120107/6/tylb1970.htm
    index:0
    uid:*******
    gameid:100015389
    data:eNrtWktv2zgQvu2hvyLw.....

    他发送的数据包大概是这样的 你可以看看他是如何加密的。。
    其实要完全杜绝是不可能的 像现在的端游 私下 都流通着很多脱机外挂
    只能增加分析难度 降低他们外挂的利润 有能力的人不屑于搞你游戏 没能力的人搞不懂就好了
    pepsin
        25
    pepsin  
       2016-01-07 23:29:12 +08:00
    提交的数据必须是个加密过的字符串, 最好通过 https 传, JS 全局做 minify. 拼字符串的时候分数通过位操作去做.

    不能说完全防住, 但是防个大多数稍懂的人也是够了.
    pubby
        26
    pubby  
       2016-01-07 23:55:23 +08:00
    @m939594960 嗯,只能通过各种方法增加作弊难度。有利可图,破解是迟早的事情,需要续斗争。

    几年前破解过一种 flash 加密,每次 swf 文件的加密部分算法和参数都在变
    最后写了个简单的 AS3 ByteCode 模拟器专门跑那部分代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2622 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.