js 向后端提交 ajax 请求,但是避免用户模拟 HTTP 上传虚假数据的思路?

2018-12-26 10:24:10 +08:00
 scriptB0y

场景:

JS 游戏在游戏结束后上传分数,但是如果用 HTTP 请求的话,用户可以随意 POST 一个分数。

如果用 JS 加密,server 解密的话,用 Chrome 调试是否也可以随意改写一个值上传上去?

2260 次点击
所在节点    问与答
12 条回复
gam2046
2018-12-26 10:33:26 +08:00
原则上没有办法,只有记录客户端的行为数据,服务端判断是否可行。

https://www.google.com/recaptcha/admin#list

可以尝试 v3 版本的 reCaptcha,是完全无侵入性,而且国内可直接使用。
ByZHkc3
2018-12-26 10:35:10 +08:00
这就是涉及到游戏反作弊的处理里,每次游戏生成一个游戏 id,可以在游戏中途上发数据,post 数据的时候可以依据游戏时间及分数上限来判断用户是否作弊
nfroot
2018-12-26 11:38:27 +08:00
用户端发来的任何数据都不可信任,都是可以伪造的,服务器端必须有机制去确认它合不合规,每隔一个时间发一个数据确认也是一个方式。


但是。。。。客户端也可以伪造。


所以重要的东西都是服务器去做运算而不是客户端。

一般都是通过行为去判断。
TomVista
2018-12-26 11:47:14 +08:00
```
function(){
...
}()
```
GDC
2018-12-26 12:05:49 +08:00
无解,分数在服务端计算
hongshaoyuancn
2018-12-26 13:17:36 +08:00
最近也在想 前端根据后端提供的密钥加上时间戳进行签名 保证签名唯一性的情况下 将数据带入后端校验唯一签名通过 其他的全部拒绝 准备试试呢。。。。。。。。。。
maichael
2018-12-26 13:26:47 +08:00
@hongshaoyuancn #6 只要你前端能做的,别人也可以模拟这一过程。
maichael
2018-12-26 13:31:56 +08:00
可以看下之前 LeanCloud 做小游戏的思路: https://zhuanlan.zhihu.com/p/52864161
t6attack
2018-12-26 13:32:31 +08:00
如果解密分析的难度过大,控制台破不了、抓包篡改数据破不了。。那我干脆用 CE 修改器直接改内存。
Mazexal
2018-12-26 13:34:35 +08:00
想想之前微信跳一跳刷分数的, 直接通过接口更新直接就炸了
scriptB0y
2018-12-26 13:45:11 +08:00
@gam2046 这个我想过,跟你想法一样。客户端的游戏我用一种 hash 算法计算出得出:游戏时间、游戏操作 最后得到的游戏分数,然后客户端计算一个 hash 值带上。验证如 P 问题和 NP 问题一样,验证这个 hash 值很快。

@hongshaoyuancn 客户端既然拿到了秘钥,那用户总看得见啊,大不了用浏览器把你的加密算法跑一下也是正确的。

@Mazexal 微信是怎么做的呢?不暴露客户端代码 + 通过加密的 TCP 传输防止抓包?
scriptB0y
2018-12-26 13:48:38 +08:00
@maichael 谢谢 看了一下也是记录中途游戏参数+参数校验。这个摸透了校验规则也是可以伪造 “稍微高于正常水平”的游戏数据的,至于离线分析,也是看游戏数据是否合理吧。感觉没有本质上解决这个问题呢。

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

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

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

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

© 2021 V2EX