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

羊了个羊只要发请求就可以通关,如何在设计层面避免这种情况

  •  1
     
  •   FstarKing · 2022-09-23 09:48:14 +08:00 · 7622 次点击
    这是一个创建于 552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    羊了个羊之前只要抓包拿到 token ,然后向他的服务器发一个 get 请求,就算通关了

    所以好多人刷了 99999+次

    如何在设计层面去防止这样的情况

    65 条回复    2022-09-26 08:44:49 +08:00
    Xyg12133617
        1
    Xyg12133617  
       2022-09-23 09:55:03 +08:00   ❤️ 17
    你该不会是作者吧[手动狗头]
    tool2d
        2
    tool2d  
       2022-09-23 09:58:58 +08:00   ❤️ 2
    学 COC 服务器,把玩家通关操作的所有手机点击指令都记录下来,通关后只把操作发给服务器。然后服务器根据玩家操作,独立演算一次,算二次验证。

    如果卡片完全消除,就算通关。

    不过也没啥用,到最后还是有人会用 AI 来玩游戏刷分。
    Mithril
        3
    Mithril  
       2022-09-23 09:59:43 +08:00   ❤️ 38
    那又怎样呢?无所谓啊。

    你要搞清楚自己的目标是什么。

    做这个就是为了卖广告的,会发请求的人,就算不让他们发了,他们会不停刷关看广告吗?

    既然不会,那为什么要花成本去管?要说影响其他用户积极性,后台隔段时间清一下数据不就完了。

    工程这个事吧,就是够用的情况下,成本越低越好。手段都是为了目的服务的。
    GeruzoniAnsasu
        4
    GeruzoniAnsasu  
       2022-09-23 09:59:44 +08:00
    不知道从哪说起好,要不你先百度百度帧同步吧



    还有一个更前提的问题是,你的设计目标图的是什么?有人能发请求跳通关,是会影响付费率?
    registerrr
        5
    registerrr  
       2022-09-23 10:00:38 +08:00
    后台存储每一场游戏的地图数据,前端每操作一步或几步都去和后台进行同步,在后台验证是否通关。
    你可能会问,这服务器压力不就大了么?对,这就是代价
    ICB
        6
    ICB  
       2022-09-23 10:00:38 +08:00
    现在还能刷吗?之前刷的都清零了。
    letitbesqzr
        7
    letitbesqzr  
       2022-09-23 10:01:25 +08:00
    如果是微信小程序,最简单的改造:用云函数 来发送通关请求

    云函数 经过微信的 mmtls 协议传输。

    mmtls : 微信现有的安全通信协议是基于用户登录的时候派发的 SessionKey 对应用数据进行加密的

    只能说门槛会更高,现在的 微信协议、各种 hook 已经能够支持 模拟请求云函数了。
    letitbesqzr
        8
    letitbesqzr  
       2022-09-23 10:04:41 +08:00   ❤️ 2
    或使用,小程序提供的接口:“小程序加密网络通道” 也能提高伪造的门槛,需要去解密微信的加密 或者 hook 微信的程序。

    为了避免小程序与开发者后台通信时数据被截取和篡改,微信侧维护了一个用户维度的可靠 key ,用于小程序和后台通信时进行加密和签名。
    开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key 。
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/user-encryptkey.html
    FstarKing
        9
    FstarKing  
    OP
       2022-09-23 10:10:26 +08:00
    @ICB 实测那个接口可以正常 200 返回,但是已经不算通关次数了
    FstarKing
        10
    FstarKing  
    OP
       2022-09-23 10:10:37 +08:00
    @letitbesqzr 这个看起来不错
    InDom
        11
    InDom  
       2022-09-23 10:10:55 +08:00   ❤️ 2
    赞同 #3 楼说法,不过也补充一个最简单做法:

    一局游戏不可能在 5 分钟内通关。

    开局一个请求,记录游戏开始时间,结束一个请求,记录结束时间,

    通过这种方案降低刷分频率,然后搞一搞防沉迷,一天不能玩太多次,或者通过其他的游戏设计让作弊无法被其他普通玩家识别。

    比如:每天只能通关一次,后面再通关只更新用时。

    这样,作弊也只能:大家都是 一天一次,用了 5 分钟。
    FstarKing
        12
    FstarKing  
    OP
       2022-09-23 10:11:10 +08:00
    @tool2d
    @registerrr
    我也这样考虑过,这个是个很好的办法,但是就是代价有点大
    FstarKing
        13
    FstarKing  
    OP
       2022-09-23 10:11:38 +08:00
    @Mithril 只是单纯的想从技术角度考虑一下,如何解决这个问题
    villivateur
        14
    villivateur  
       2022-09-23 10:14:58 +08:00
    我觉得单纯加 https ,然后客户端拒绝信任用户自定义证书就行了
    registerrr
        15
    registerrr  
       2022-09-23 10:20:08 +08:00
    @InDom #11 你搞了防沉迷,还怎么让用户看广告赚钱😏
    watzds
        16
    watzds  
       2022-09-23 10:23:01 +08:00
    看到旁边有人通过了,玩得更起劲了
    registerrr
        17
    registerrr  
       2022-09-23 10:23:19 +08:00
    @registerrr #15 听说赚了两套 200 平的大平层,这防沉迷一开,怕是连个 80 平的小户型也买不到了
    Mithril
        18
    Mithril  
       2022-09-23 10:24:30 +08:00   ❤️ 1
    @FstarKing 我这个就是从技术角度考虑的啊。
    在这个场景下,从技术角度考虑,这根本不是需要解决的问题。

    另外反作弊和反破解,网站的安全防护等等是一样的,都是成本问题,而不是单纯的技术问题。
    你要反作弊,防护等级越高,本质上就是要把越多的计算移到服务端来做。但你就算只扔个瘦客户端给客户,也防不住输入模拟+图像识别。除非强制开启摄像头。

    最简单的,每局游戏保存生成地图的随机数种子。然后用它作为请求参数后台验证。这个可以防止你直接构造请求,用微信的加密更好一些。
    同时也可以用它在后台做个模拟器,让用户发过来每步的点击操作,直接重放判断是否通关。这个性能消耗也不算太高。

    但要我是开发肯定哪个都不做,就定期登上去清理一下看不顺眼的数据。反正热度过去了服务器都不用续费的东西,还不如想想这么多钱要干嘛。现在这个状态,多写一行代码就算我输。
    oldshensheep
        19
    oldshensheep  
       2022-09-23 10:29:06 +08:00
    2 楼 5 楼的方法是正解,游戏防作弊,主要要求就是记录玩家操作,然后服务器端运算验证。
    但是我看了一下游戏说明好像是 3 消类游戏?那用算法解就很快了。那就只能检测客户端输入的有效性,基本上无解
    xmumiffy
        20
    xmumiffy  
       2022-09-23 10:34:32 +08:00 via Android
    @oldshensheep 没事 这游戏大部分实例都是无解的,就算拿算法也只能快速地刷到确认无解
    qsnow6
        21
    qsnow6  
       2022-09-23 10:34:32 +08:00
    没必要!
    zaul
        22
    zaul  
       2022-09-23 10:35:25 +08:00 via iPhone   ❤️ 1
    @Mithril 听君一席话,胜敲 5 年代码
    qsnow6
        23
    qsnow6  
       2022-09-23 10:35:51 +08:00
    但是如果非要加强防护的话,这个场景下,帧重放确实是拦截异常数据比较高的方案。
    GLee9507
        24
    GLee9507  
       2022-09-23 10:37:59 +08:00
    @villivateur 这是防抓包吧,root 后直接添加系统证书
    knva
        25
    knva  
       2022-09-23 10:40:21 +08:00
    没啥用.
    doomzc
        26
    doomzc  
       2022-09-23 10:56:01 +08:00
    我想问 不是这两天不能刷了么??
    qbuer
        27
    qbuer  
       2022-09-23 10:58:19 +08:00
    我的想法:通关的消除顺序是某个方程的解,服务器带入计算就知道是否完成了游戏。类似挖矿,用户需要耗费脑力求解,服务器只需少量计算即可验证。至于实现方法。。。不知道
    avenger
        28
    avenger  
       2022-09-23 11:01:31 +08:00
    类似 CSRF 的方案可行吗?
    Jooooooooo
        29
    Jooooooooo  
       2022-09-23 11:03:56 +08:00
    2l 看起来是个解法.
    eycode
        30
    eycode  
       2022-09-23 11:04:15 +08:00
    源码加密,防止泄露加密方式,请求提交带安全码,可行???
    yyf1234
        31
    yyf1234  
       2022-09-23 11:19:30 +08:00 via iPhone
    不使用明文传输,就可以拦住 99%的脚本小子了
    fank99
        32
    fank99  
       2022-09-23 11:24:15 +08:00
    逆向老哥的眼里,什么加 token 、源码加密都没用
    有用的是 提高逆向的成本,杜绝一部分人。不过正如 3L 所说,这个问题是无所谓的
    janus77
        33
    janus77  
       2022-09-23 11:30:32 +08:00   ❤️ 1
    换成提交的请求呗,结果有通关成功和通关失败。服务端自己拉取分数进行判断是否是通关。
    HugoChao
        34
    HugoChao  
       2022-09-23 11:31:37 +08:00
    #3 说的太好了
    marcong95
        35
    marcong95  
       2022-09-23 11:33:02 +08:00
    考虑到这个游戏是为了让人看广告的,那么可以有一种更加粗暴的反作弊、反 AI 的方法:如果这个玩家在本局游戏内看的广告少于一定阈值,就不计成绩😂

    如果考虑到运气或者技术因素,那可以把这名玩家所有游戏记录做个平均数
    Reficul
        36
    Reficul  
       2022-09-23 12:01:25 +08:00
    POW ,用户一边玩一边挖矿。 (逃
    des
        37
    des  
       2022-09-23 12:08:25 +08:00 via iPhone
    所以你就是作者?
    cjpjxjx
        38
    cjpjxjx  
       2022-09-23 12:36:49 +08:00 via iPhone
    检测通关时间太快的玩家不出现在好友列表里,仅自己可见,自娱自乐去吧
    zapper
        39
    zapper  
       2022-09-23 12:40:04 +08:00
    设计成通关不了,就不会有这种烦恼
    darkengine
        40
    darkengine  
       2022-09-23 12:52:18 +08:00
    "这个问题优先级放到最低"
    xuanbg
        41
    xuanbg  
       2022-09-23 13:28:51 +08:00
    牌的花色根本就是随机的,不说每种花色的数量不是 3 的整数倍,连牌的总数都不是 3 的整数倍好不好。。。这个不是游戏,玩的是人心,赚的是广告。so……你爱刷就刷呗,有什么打紧?反正也不耽误我赚钱。说不得我赚的更多了呢。。。又何必和自己过不去,和钱过不去呢。
    jifengg
        42
    jifengg  
       2022-09-23 14:40:08 +08:00
    开脑洞:

    开局前,请求后台,返回 {"can_pass":true , "pass_token":"xxx"},如果 can_pass=false ,前端生成无法通关的牌,反之生成能通关的(但是玩家不一定能通关)。
    通关用 pass_token 提交数据,后台根据这个唯一且一次性的 token ,判断是否作弊。
    这样玩游戏变成可有可无的手段,能不能通关完全就是你服务器控制的,所有防作弊手段在服务端判断。
    bk201
        43
    bk201  
       2022-09-23 14:51:34 +08:00
    参考其他游戏的防作弊措施,只能说很难,只能起一个监控线程去监视。即使是重放判断也不能解决防作弊吧,只要有现成的请求模版就 pass 了。
    zxfeng
        44
    zxfeng  
       2022-09-23 15:13:14 +08:00
    @GeruzoniAnsasu 啥就帧同步了啊,真就是听说个名词就到处用。人家问的如何设计或者从技术角度避免玩家对游戏结果作弊。
    muchengxue
        45
    muchengxue  
       2022-09-23 15:28:42 +08:00
    @marcong95 666 ,这个好,不看两次广告成绩不作数
    sugars
        46
    sugars  
       2022-09-23 15:33:51 +08:00
    这是之前的刷法吧,现在没用了
    dtgxx
        47
    dtgxx  
       2022-09-23 15:50:56 +08:00
    @Xyg12133617 #1 你太逗了,哈哈哈哈哈
    zjuster
        48
    zjuster  
       2022-09-23 16:12:59 +08:00
    没有必要。在玩这个游戏的人群里,100 个人里面也没有 1 个人有这样的能力来实现,且不放弃其他 99 个人按照预期玩游戏。

    技术上的解决方案,不如游玩流程上来屏蔽(减少奖励等方式)。

    换句话说就是优先级最低,毕竟赚的不是内购道具通关的钱。

    所以 2L 给的是就上的答案,3L 给的就是实际上的解决方案。

    学习了。
    mxT52CRuqR6o5
        49
    mxT52CRuqR6o5  
       2022-09-23 16:20:01 +08:00
    @FstarKing #2 的方案代价也不大啊,就好像你做斗地主游戏得验证玩家的出牌是否合法一样,虽然没法防止 AI 解题(这个属于策略游戏自身性质的问题,是无解的),但至少『只要发请求就可以通关』这种情况可以避免了
    cedoo22
        50
    cedoo22  
       2022-09-23 16:31:40 +08:00
    不从工程角度,单从技术角度来说。
    打点, 不停打点。。。然后做用户操作路径扫描, 最明显的操作频率、事件先后、时间这几个点一查,直接废弃掉记录。
    hhjswf
        51
    hhjswf  
       2022-09-23 17:13:53 +08:00
    有没有办法让人抓不到包,我看有些 app 包很难抓
    zenyangfeng
        52
    zenyangfeng  
       2022-09-23 17:18:05 +08:00
    微信小程序有一个 wx.login 函数,可以获取用户 jscode 。服务器用 jscode 和 appid 、appsecret 换取用户 openid ,jscode 只能使用一次,可以上传数据的时候校验 jscode 判断是不是小程序发送的请求
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
    zenyangfeng
        53
    zenyangfeng  
       2022-09-23 17:18:58 +08:00
    @hhjswf ios 抓包很简单
    dongtingyue
        54
    dongtingyue  
       2022-09-23 17:40:51 +08:00
    通一关传后台记录下
    加强版:每个操作都传后端验证,通一关的时候检测下操作是否异常。但是这样服务器压力会变大
    brust
        55
    brust  
       2022-09-23 18:45:55 +08:00
    @ICB #6

    可以我刷了几百次

    原理很简单
    1.抓包找到
    https://cat-match.easygame2021.com/sheep/v1/game/map_info_ex?matchType=3
    返回的参数 用抓包工具修改下 把第二关的地图改成和第一关一样

    2.然后通关 可以找到这个通关接口
    复制这个接口 可以批量刷多次

    更新过后好像验证了时间戳 但是没有幂等
    GeruzoniAnsasu
        56
    GeruzoniAnsasu  
       2022-09-23 19:04:54 +08:00
    @zxfeng 很难理解吗? 解决方案是把操作运算放到服务端,那是不是还是帧同步 /状态同步?


    OP 这个问题本来就问的很空泛,没人知道他想问的是

    微信小程序有没有内置方案
    还是游戏如何反作弊
    还是接口如何鉴权
    还是不清楚服务器运算的基础设计

    那能怎么办呢,不如先多看看概念让他自己想想有什么方法做到
    20150517
        57
    20150517  
       2022-09-23 19:11:16 +08:00
    我就想问为啥 SSL 加密的 api 通讯会被破解了?程序被用中间人证书了?
    20150517
        58
    20150517  
       2022-09-23 19:12:21 +08:00
    @zenyangfeng 如果抓包简单,为什么还有手机 farm 的存在,不就是因为分析不了包,只能靠模拟吗
    ZzFoo
        59
    ZzFoo  
       2022-09-23 19:38:47 +08:00
    客户端和服务端约定好加密方式和 token ,客户端把 userId + 时间戳 + 一个随机数 加密算出一个 signature ,服务端校验就行了
    0o0O0o0O0o
        60
    0o0O0o0O0o  
       2022-09-23 19:44:42 +08:00 via iPhone
    不需要管,异常数据清空封号,邀请五个人可以解封,用户造假门槛通过微信平台大幅度提高,你不需要操心,榨取开挂者的剩余价值。
    fuxkcsdn
        61
    fuxkcsdn  
       2022-09-23 20:40:32 +08:00
    @tool2d
    AI ?
    这 B 游戏不想让你过你就算是天网来也没用
    Ashore
        62
    Ashore  
       2022-09-23 21:18:25 +08:00
    微信小程序能实现楼上说的这些操作吗?
    icyalala
        63
    icyalala  
       2022-09-23 21:53:23 +08:00
    @GeruzoniAnsasu 这种小游戏搞什么帧同步。。
    就把关卡和随机数种子记录下,玩家全部打完后,把行为记录和结果统一提交上来就好。
    有问题的再圈出来这部分日志复现一下。
    zxfeng
        64
    zxfeng  
       2022-09-25 11:52:25 +08:00
    @GeruzoniAnsasu
    首先 OP 问的已经很具体了,你对 op 问的 向的服务器发送 get 请求就通关了估计都没去查查是真么回事,如果这个描述还是空泛,那只能说你脑补太多了。
    其实,你上来让人去百度帧同,但帧同步解决的问题根本不是 op 想问的游戏结果验证问题,如果你想说服务端重算操作验证 那和同步方案采用帧同步还是状态同步没有关系。 就羊这个游戏,明显类似棋牌这种回合或者低频操作的游戏你推荐帧同步我眼怀疑你根本没有做过帧同步的游戏。
    letitbesqzr
        65
    letitbesqzr  
       2022-09-26 08:44:49 +08:00   ❤️ 1
    @zenyangfeng #52

    jscode 还是存在很多问题,比如 没办法区分场景。

    比如我代理拦截获取到登陆时的 jscode (几乎打开就会触发),拿去上传数据使用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3172 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:26 · PVG 20:26 · LAX 05:26 · JFK 08:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.