V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zero3412
V2EX  ›  程序员

H5 游戏,外部如何修改游戏值提交的?

  •  
  •   zero3412 · 3 天前 · 2487 次点击
    发现有很多刷票的人。
    let gameScore = 0;
    游戏改变游戏得分 gameScore
    ajax(postUrl, {score : gameScore }, true).then( res => {
    console.log(res)
    }).catch( (error) => {
    console.log(error)
    }).finally(() => {});

    后端增加了 HTTP_REFERER 与 HTTP_ORIGIN 检测、双 cookies 检测、提交时间检测。

    感觉是使用了啥模拟器,抓包改游戏数据提交的,所以其它检测都没啥用。
    27 条回复    2024-07-05 10:40:29 +08:00
    laommmm
        1
    laommmm  
       3 天前 via Android
    都做游戏引那么大的包了,都舍不得引 200K 的加密包?
    zero3412
        2
    zero3412  
    OP
       3 天前
    @laommmm 使用将用户 token➕时间戳进行 RSA 后提交
    Marthemis
        3
    Marthemis  
       3 天前
    普通的。浏览器打开 f12 ,找到提交分数的接口,找到在哪个方法调用的,将 score 这个参数固定传一个 9999999 。
    zephyru
        4
    zephyru  
       3 天前
    @zero3412 这种写在前端的话,对着源码 debug ,找到加密前提交前即将执行的函数,加个断点,自己想提交什么提交什么区别应该不大
    zero3412
        5
    zero3412  
    OP
       3 天前
    @zephyru 哪里有教程么?学习一下,另外有什么解法?
    zero3412
        6
    zero3412  
    OP
       3 天前
    @Marthemis 微信浏览器环境,但我感觉与普通浏览器区别不大。
    renmu
        7
    renmu  
       3 天前 via Android
    对用户每一步操作发送信息到接口,最后计算操作是否与分数一致
    hezhou920
        8
    hezhou920  
       3 天前
    我感觉根本上前端无法解决掉这个问题,只能增加篡改难度。根本上解决还是得将计算逻辑放到后端。
    zero3412
        9
    zero3412  
    OP
       3 天前
    @renmu 就是 H5 的小程序,得分全靠前端获得的 -_!!
    zero3412
        10
    zero3412  
    OP
       3 天前
    @hezhou920 所以我感觉使用了模拟器啥的,只修改了游戏得分,其它能验证的数据都是正常的。
    LuckyLauncher
        11
    LuckyLauncher  
       3 天前
    能说一下是什么类型的游戏么,感觉只能加风控提高破解成本或者将得分放到后端计算
    zero3412
        12
    zero3412  
    OP
       3 天前
    @LuckyLauncher 可以理解为纯前端得分的 html5 游戏,类似 120 秒倒计时填词,余多少秒即为得分值,
    但后台都是 119 秒就完成的 -_!!
    imdong
        13
    imdong  
       3 天前 via iPhone
    贵司这代码好眼熟…端午女朋友公司的 H5 活动,抓了一下代码,连变量名都一样,看着就是一个通用模板然后改一下素材就上线的。

    提交接口分数有加密,加密的方法是一个看起来随机的函数名,但所有的代码都没有搜索到相关内容,但好巧不巧不巧看到一段所谓“最强”加密后的代码,好巧不巧不巧鄙人擅长此加密的脱密,好巧不巧又是这个加密里面最容易还原的,两分钟就取出函数内容,好了,现在,先调用函数算出一个分数的密文,然后复制一个请求到 curl 命令,替换加密分数,回车,搞定。‘前后总耗时 30 分钟’

    端午前一天,女朋友拎着活动奖品回家了(特意刷的二等奖,因为一等奖不需要)
    LuckyLauncher
        14
    LuckyLauncher  
       3 天前
    @zero3412 #12 首先从风控角度不可能 1 秒就完成游戏的,这些账户设备可以都 ban 了,其次,可以记录开始时间,每填一个词都记录下时间,时间过于离谱的也按作弊处理
    zero3412
        15
    zero3412  
    OP
       3 天前
    @imdong 哈哈哈,这边代码中没有这个“最强”加密函数,也没有为得分进行加密,能分享下这个最强加密么,至少给你造成了 30 分钟的难度。
    hwf
        16
    hwf  
       3 天前
    每道题记录一下答题填写的时间, 不合理的就按作弊处理
    vace
        17
    vace  
       3 天前
    直接提交分数这种,仅在前端无法避免,加密也无法避免,只能不断提高门槛,踢掉一些脚本小子。

    简单的互动可以服务端验算,把用户的操作 log 下来,在服务端推导分数验证,但开发成本比较高了。
    imdong
        18
    imdong  
       3 天前 via iPhone   ❤️ 1
    关于这个加密可以在我资料页进我博客搜索加密,最牛相关关键词找一下,应该会有 3 篇文章讲解,具体细节我也忘记了。

    至于怎么反破解,如果只是小游戏,短期的东西,我给你一个实现简单效果好的方案:

    首先游戏道具生成之类的不要真随机,要通过下发随机数种子,然后要有带时间的得分纪录,客户端不要只提交分数,把种子和得分纪录都提交。

    服务器拿到数据,要确认种子是自己下发的,且只能用一次。然后分数保存到数据库就好了。

    什么?你问我得分 log 呢?丢掉,直接丢掉。没用的东西,只是障眼法。

    你要在客户端就体现出:我做了很多防御,这个东西搭眼一看就知道是一时半会搞不定的东西,还是别浪费时间了。放弃放弃。
    @zero3412 #15
    zephyru
        19
    zephyru  
       3 天前
    @zero3412 分数计算上报只要在前端做,就总会被绕过去/破解,无非是成本问题,真的想解决,只能把操作传给后端,让后端去算,(不知道把这个逻辑丢到 worker 里去会不会更安全些?没试过)
    Nitsuya
        20
    Nitsuya  
       3 天前
    这种直接改 js 逻辑,排除掉错误,加大得分触发率,然后正常的玩儿游戏,最后提交老高的分数....曾经无数个 V 号,试探服务器 ban 上限....这种很难搞,因为根本不从报文入手.
    tomatocici2333
        21
    tomatocici2333  
       3 天前
    转到后端处理才能从根上解决
    neptuno
        22
    neptuno  
       3 天前 via iPhone
    用户手册里面没说刷票作废成绩吗
    a62527776a
        23
    a62527776a  
       3 天前
    前端重放录制 人工审核呗
    laommmm
        24
    laommmm  
       2 天前 via Android
    你有做代码混淆吗?
    买第三方混淆服务,混淆后发上去试下。
    geekdonie
        25
    geekdonie  
       2 天前
    前端防不住的,就算你把代码混淆掉,只抓网络请求一样分析出来。
    真要搞的话就从服务端入手,分析用户的异常行为,人工判定或者训练模型去机器判定。
    所谓的防只是加大破解难度而已,还要考虑一个投入产出比,花 100w 去强化一个只值 10w 的项目那就没必要了。
    我也是做 H5 的小游戏,每个游戏最后提交一个成绩计入榜单,根本不怕刷,因为排名不涉及核心业务。
    zero3412
        26
    zero3412  
    OP
       1 天前
    @geekdonie 如何理解最后这句话 “每个游戏最后提交一个成绩计入榜单,排名不涉及核心业务” 呢?
    seedhk
        27
    seedhk  
       1 天前
    说到 H5 改数据,让我想起阿里月饼事件。。。。。(手动狗头保命)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   872 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:48 · PVG 04:48 · LAX 13:48 · JFK 16:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.