场景:
JS 游戏在游戏结束后上传分数,但是如果用 HTTP 请求的话,用户可以随意 POST 一个分数。
如果用 JS 加密,server 解密的话,用 Chrome 调试是否也可以随意改写一个值上传上去?
1
gam2046 2018-12-26 10:33:26 +08:00 1
原则上没有办法,只有记录客户端的行为数据,服务端判断是否可行。
https://www.google.com/recaptcha/admin#list 可以尝试 v3 版本的 reCaptcha,是完全无侵入性,而且国内可直接使用。 |
2
ByZHkc3 2018-12-26 10:35:10 +08:00
这就是涉及到游戏反作弊的处理里,每次游戏生成一个游戏 id,可以在游戏中途上发数据,post 数据的时候可以依据游戏时间及分数上限来判断用户是否作弊
|
3
nfroot 2018-12-26 11:38:27 +08:00
用户端发来的任何数据都不可信任,都是可以伪造的,服务器端必须有机制去确认它合不合规,每隔一个时间发一个数据确认也是一个方式。
但是。。。。客户端也可以伪造。 所以重要的东西都是服务器去做运算而不是客户端。 一般都是通过行为去判断。 |
4
TomVista 2018-12-26 11:47:14 +08:00
```
function(){ ... }() ``` |
5
GDC 2018-12-26 12:05:49 +08:00 via iPhone
无解,分数在服务端计算
|
6
hongshaoyuancn 2018-12-26 13:17:36 +08:00
最近也在想 前端根据后端提供的密钥加上时间戳进行签名 保证签名唯一性的情况下 将数据带入后端校验唯一签名通过 其他的全部拒绝 准备试试呢。。。。。。。。。。
|
7
maichael 2018-12-26 13:26:47 +08:00
@hongshaoyuancn #6 只要你前端能做的,别人也可以模拟这一过程。
|
8
maichael 2018-12-26 13:31:56 +08:00 1
可以看下之前 LeanCloud 做小游戏的思路: https://zhuanlan.zhihu.com/p/52864161
|
9
t6attack 2018-12-26 13:32:31 +08:00
如果解密分析的难度过大,控制台破不了、抓包篡改数据破不了。。那我干脆用 CE 修改器直接改内存。
|
10
Mazexal 2018-12-26 13:34:35 +08:00
想想之前微信跳一跳刷分数的, 直接通过接口更新直接就炸了
|
11
scriptB0y OP @gam2046 这个我想过,跟你想法一样。客户端的游戏我用一种 hash 算法计算出得出:游戏时间、游戏操作 最后得到的游戏分数,然后客户端计算一个 hash 值带上。验证如 P 问题和 NP 问题一样,验证这个 hash 值很快。
@hongshaoyuancn 客户端既然拿到了秘钥,那用户总看得见啊,大不了用浏览器把你的加密算法跑一下也是正确的。 @Mazexal 微信是怎么做的呢?不暴露客户端代码 + 通过加密的 TCP 传输防止抓包? |