5

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

 1 year ago
source link: https://www.v2ex.com/t/882304
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  问与答

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

  FstarKing · 9 小时 40 分钟前 · 4666 次点击

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

所以好多人刷了 99999+次

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

58 条回复    2022-09-23 19:12:21 +08:00
Xyg12133617

Xyg12133617      9 小时 34 分钟前   ❤️ 10

你该不会是作者吧[手动狗头]
tool2d

tool2d      9 小时 30 分钟前   ❤️ 1

学 COC 服务器,把玩家通关操作的所有手机点击指令都记录下来,通关后只把操作发给服务器。然后服务器根据玩家操作,独立演算一次,算二次验证。

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

不过也没啥用,到最后还是有人会用 AI 来玩游戏刷分。
Mithril

Mithril      9 小时 29 分钟前   ❤️ 31

那又怎样呢?无所谓啊。

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

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

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

工程这个事吧,就是够用的情况下,成本越低越好。手段都是为了目的服务的。
GeruzoniAnsasu

GeruzoniAnsasu      9 小时 29 分钟前

不知道从哪说起好,要不你先百度百度帧同步吧

还有一个更前提的问题是,你的设计目标图的是什么?有人能发请求跳通关,是会影响付费率?
registerrr

registerrr      9 小时 28 分钟前

后台存储每一场游戏的地图数据,前端每操作一步或几步都去和后台进行同步,在后台验证是否通关。
你可能会问,这服务器压力不就大了么?对,这就是代价
ICB

ICB      9 小时 28 分钟前

现在还能刷吗?之前刷的都清零了。
letitbesqzr

letitbesqzr      9 小时 27 分钟前

如果是微信小程序,最简单的改造:用云函数 来发送通关请求

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

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

只能说门槛会更高,现在的 微信协议、各种 hook 已经能够支持 模拟请求云函数了。
letitbesqzr

letitbesqzr      9 小时 24 分钟前   ❤️ 1

或使用,小程序提供的接口:“小程序加密网络通道” 也能提高伪造的门槛,需要去解密微信的加密 或者 hook 微信的程序。

为了避免小程序与开发者后台通信时数据被截取和篡改,微信侧维护了一个用户维度的可靠 key ,用于小程序和后台通信时进行加密和签名。
开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key 。
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/user-encryptkey.html
FstarKing

FstarKing      9 小时 18 分钟前

@ICB 实测那个接口可以正常 200 返回,但是已经不算通关次数了
InDom

InDom      9 小时 18 分钟前   ❤️ 2

赞同 #3 楼说法,不过也补充一个最简单做法:

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

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

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

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

这样,作弊也只能:大家都是 一天一次,用了 5 分钟。
FstarKing

FstarKing      9 小时 17 分钟前

@tool2d
@registerrr
我也这样考虑过,这个是个很好的办法,但是就是代价有点大
FstarKing

FstarKing      9 小时 17 分钟前

@Mithril 只是单纯的想从技术角度考虑一下,如何解决这个问题
villivateur

villivateur      9 小时 14 分钟前

我觉得单纯加 https ,然后客户端拒绝信任用户自定义证书就行了
registerrr

registerrr      9 小时 8 分钟前

@InDom #11 你搞了防沉迷,还怎么让用户看广告赚钱😏
watzds

watzds      9 小时 6 分钟前

看到旁边有人通过了,玩得更起劲了
registerrr

registerrr      9 小时 5 分钟前

@registerrr #15 听说赚了两套 200 平的大平层,这防沉迷一开,怕是连个 80 平的小户型也买不到了
Mithril

Mithril      9 小时 4 分钟前   ❤️ 1

@FstarKing 我这个就是从技术角度考虑的啊。
在这个场景下,从技术角度考虑,这根本不是需要解决的问题。

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

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

但要我是开发肯定哪个都不做,就定期登上去清理一下看不顺眼的数据。反正热度过去了服务器都不用续费的东西,还不如想想这么多钱要干嘛。现在这个状态,多写一行代码就算我输。
oldshensheep

oldshensheep      8 小时 59 分钟前

2 楼 5 楼的方法是正解,游戏防作弊,主要要求就是记录玩家操作,然后服务器端运算验证。
但是我看了一下游戏说明好像是 3 消类游戏?那用算法解就很快了。那就只能检测客户端输入的有效性,基本上无解
xmumiffy

xmumiffy      8 小时 54 分钟前 via Android

@oldshensheep 没事 这游戏大部分实例都是无解的,就算拿算法也只能快速地刷到确认无解
qsnow6

qsnow6      8 小时 54 分钟前

zaul

zaul      8 小时 53 分钟前 via iPhone   ❤️ 1

@Mithril 听君一席话,胜敲 5 年代码
qsnow6

qsnow6      8 小时 53 分钟前

但是如果非要加强防护的话,这个场景下,帧重放确实是拦截异常数据比较高的方案。
GLee9507

GLee9507      8 小时 51 分钟前

@villivateur 这是防抓包吧,root 后直接添加系统证书
knva

knva      8 小时 48 分钟前

doomzc

doomzc      8 小时 33 分钟前

我想问 不是这两天不能刷了么??
qbuer

qbuer      8 小时 30 分钟前

我的想法:通关的消除顺序是某个方程的解,服务器带入计算就知道是否完成了游戏。类似挖矿,用户需要耗费脑力求解,服务器只需少量计算即可验证。至于实现方法。。。不知道
avenger

avenger      8 小时 27 分钟前

类似 CSRF 的方案可行吗?
Jooooooooo

Jooooooooo      8 小时 25 分钟前

2l 看起来是个解法.
eycode

eycode      8 小时 24 分钟前

源码加密,防止泄露加密方式,请求提交带安全码,可行???
yyf1234

yyf1234      8 小时 9 分钟前 via iPhone

不使用明文传输,就可以拦住 99%的脚本小子了
fank99

fank99      8 小时 4 分钟前

逆向老哥的眼里,什么加 token 、源码加密都没用
有用的是 提高逆向的成本,杜绝一部分人。不过正如 3L 所说,这个问题是无所谓的
janus77

janus77      7 小时 58 分钟前   ❤️ 1

换成提交的请求呗,结果有通关成功和通关失败。服务端自己拉取分数进行判断是否是通关。
HugoChao

HugoChao      7 小时 57 分钟前

#3 说的太好了
marcong95

marcong95      7 小时 56 分钟前

考虑到这个游戏是为了让人看广告的,那么可以有一种更加粗暴的反作弊、反 AI 的方法:如果这个玩家在本局游戏内看的广告少于一定阈值,就不计成绩😂

如果考虑到运气或者技术因素,那可以把这名玩家所有游戏记录做个平均数
Reficul

Reficul      7 小时 27 分钟前

POW ,用户一边玩一边挖矿。 (逃
des

des      7 小时 20 分钟前 via iPhone

所以你就是作者?
cjpjxjx

cjpjxjx      6 小时 52 分钟前 via iPhone

检测通关时间太快的玩家不出现在好友列表里,仅自己可见,自娱自乐去吧
zapper

zapper      6 小时 49 分钟前

设计成通关不了,就不会有这种烦恼
darkengine

darkengine      6 小时 36 分钟前

"这个问题优先级放到最低"
xuanbg

xuanbg      6 小时 0 分钟前

牌的花色根本就是随机的,不说每种花色的数量不是 3 的整数倍,连牌的总数都不是 3 的整数倍好不好。。。这个不是游戏,玩的是人心,赚的是广告。so……你爱刷就刷呗,有什么打紧?反正也不耽误我赚钱。说不得我赚的更多了呢。。。又何必和自己过不去,和钱过不去呢。
jifengg

jifengg      4 小时 48 分钟前

开脑洞:

开局前,请求后台,返回 {"can_pass":true , "pass_token":"xxx"},如果 can_pass=false ,前端生成无法通关的牌,反之生成能通关的(但是玩家不一定能通关)。
通关用 pass_token 提交数据,后台根据这个唯一且一次性的 token ,判断是否作弊。
这样玩游戏变成可有可无的手段,能不能通关完全就是你服务器控制的,所有防作弊手段在服务端判断。
bk201

bk201      4 小时 37 分钟前

参考其他游戏的防作弊措施,只能说很难,只能起一个监控线程去监视。即使是重放判断也不能解决防作弊吧,只要有现成的请求模版就 pass 了。
zxfeng

zxfeng      4 小时 15 分钟前

@GeruzoniAnsasu 啥就帧同步了啊,真就是听说个名词就到处用。人家问的如何设计或者从技术角度避免玩家对游戏结果作弊。
muchengxue

muchengxue      4 小时 0 分钟前

@marcong95 666 ,这个好,不看两次广告成绩不作数
sugars

sugars      3 小时 55 分钟前

这是之前的刷法吧,现在没用了
dtgxx

dtgxx      3 小时 38 分钟前

@Xyg12133617 #1 你太逗了,哈哈哈哈哈
zjuster

zjuster      3 小时 16 分钟前

没有必要。在玩这个游戏的人群里,100 个人里面也没有 1 个人有这样的能力来实现,且不放弃其他 99 个人按照预期玩游戏。

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

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

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

学习了。
mxT52CRuqR6o5

mxT52CRuqR6o5      3 小时 9 分钟前

@FstarKing #2 的方案代价也不大啊,就好像你做斗地主游戏得验证玩家的出牌是否合法一样,虽然没法防止 AI 解题(这个属于策略游戏自身性质的问题,是无解的),但至少『只要发请求就可以通关』这种情况可以避免了
cedoo22

cedoo22      2 小时 57 分钟前

不从工程角度,单从技术角度来说。
打点, 不停打点。。。然后做用户操作路径扫描, 最明显的操作频率、事件先后、时间这几个点一查,直接废弃掉记录。
hhjswf

hhjswf      2 小时 15 分钟前

有没有办法让人抓不到包,我看有些 app 包很难抓
zenyangfeng

zenyangfeng      2 小时 11 分钟前

微信小程序有一个 wx.login 函数,可以获取用户 jscode 。服务器用 jscode 和 appid 、appsecret 换取用户 openid ,jscode 只能使用一次,可以上传数据的时候校验 jscode 判断是不是小程序发送的请求
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
zenyangfeng

zenyangfeng      2 小时 10 分钟前

@hhjswf ios 抓包很简单
dongtingyue

dongtingyue      1 小时 48 分钟前

通一关传后台记录下
加强版:每个操作都传后端验证,通一关的时候检测下操作是否异常。但是这样服务器压力会变大
brust

brust      43 分钟前

@ICB #6

可以我刷了几百次

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

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

更新过后好像验证了时间戳 但是没有幂等
GeruzoniAnsasu

GeruzoniAnsasu      24 分钟前

@zxfeng 很难理解吗? 解决方案是把操作运算放到服务端,那是不是还是帧同步 /状态同步?


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

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

那能怎么办呢,不如先多看看概念让他自己想想有什么方法做到
20150517

20150517      17 分钟前

我就想问为啥 SSL 加密的 api 通讯会被破解了?程序被用中间人证书了?
20150517

20150517      16 分钟前

@zenyangfeng 如果抓包简单,为什么还有手机 farm 的存在,不就是因为分析不了包,只能靠模拟吗

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK