请教一个关于 APP 端统计防作弊的问题

2015-09-03 20:24:39 +08:00
 int64ago

业务需求抽象一下,大概是这样:
APP 跟后台是通过 REST 交互,后台会收集 APP 统计的一些手机数据(比如在线时间)

现在的问题是:如何防止有心人通过脚本模拟这个过程制造虚假的数据?
要求不要影响 APP 端的体验,因为统计是不定时后台行为,所以验证码等方法肯定不行

提前感谢下,我想了很久,没找到合适的方案

哦,对了,方案可以从 APP 或者后台任何一方下手,都没关系

3121 次点击
所在节点    程序员
22 条回复
halfcrazy
2015-09-03 20:39:06 +08:00
敏感数据不要存客户端或者相信客户端的。服务器端做
int64ago
2015-09-03 21:04:47 +08:00
@halfcrazy 可能误解我意思了,并没有敏感数据
比如 APP 的在线时间上传,我需要的效果是服务端如何才能判断收到的数据就是手机发过来的,而不是用户自行抓包分析后写脚本模拟的
qiayue
2015-09-03 21:09:49 +08:00
那就需要有一种机制可以保证你客户端发出的数据他人模仿不了。
比如说使用某种加密方式,密钥在客户端和服务器都存一份,客户端加密,服务端解密。
这样子的话,只要你能够保证你的客户端的密钥不会被人看到,那么你的请求就是可信的。
问题就转变成了如何使他人无法破解你的安装包。
Septembers
2015-09-03 21:14:30 +08:00
int64ago
2015-09-03 21:34:26 +08:00
@Septembers 这问题好像是复杂了

其实最终退化为:可以用脚本模拟 QQ 挂在线时间吗?
iyaozhen
2015-09-03 21:41:01 +08:00
就看楼长数据目的是干嘛,比如说是计算日活就没必要在意,因为没人刷。若是在线时长什么的可以换礼品那就只能影响用户体验在连续几个小时后弹验证码。

@int64ago 协议很复杂的话不行。现在挂 QQ 都是实体客户端直接挂
int64ago
2015-09-03 21:52:17 +08:00
@iyaozhen 就是你的意思,在线时间换小礼物,心碎 😂
wuling
2015-09-03 21:54:55 +08:00
客户端加密密钥 a :
1 、客户端向服务器发请求,内容=k (a ,第一步标志,当前时间 t ,随机数 x )
2 、服务端解密,返回内容=k (a ,第二步标志, t , x ,随机数 y )
3 、客户端解密,如果收到时间相距正常,且 x 是之前发的 x ,则再次发送:内容=k (a ,第三步标志, t , x+y )
4 、服务器解析,如果收到 t 、 x 、 y 都是正确的,且第三步收到的时间和 t 相差在正常范围内,那么就接受

设计一个安全协议挺难的,不过上面这个暂时还没想到什么明显的漏洞
wuling
2015-09-03 21:55:51 +08:00
@wuling a 是客户端和服务器都知道的密钥, k 是加密算法
int64ago
2015-09-03 21:58:59 +08:00
@wuling 对!我刚刚也突然想到这样做
这个得依赖 APP 抗反编译能力,不过好多了
zhicheng
2015-09-03 22:01:48 +08:00
@wuling

说的挺玄乎,但没什么用。不管密钥还是算法,一样是存在客户端的。脚本一样模拟得出来。
Strikeactor
2015-09-03 22:06:42 +08:00
弄个算法每次请求算个验证码给服务器呗
只要算法不被人猜出来或是用其他方式拿到,请求就模拟不出来
lcqtdwj
2015-09-03 22:07:08 +08:00
最终还是反编译问题,如果算法没那么容易猜到的话
qiayue
2015-09-03 22:16:17 +08:00
@zhicheng 如果不破解安装包获取密钥,请问一般怎么去模拟?
int64ago
2015-09-03 22:21:30 +08:00
@zhicheng 考虑到抗反编译,加密模块可以考虑用 C 写,如果还是有人要反编译的话那也没办法了!毕竟小应用,应该没人会那么无聊花精力弄的
想想也不太可能从反编译的 so 里获得有效的信息,因为加密的代码可能很复杂,汇编根本不好分析

当然,如果有人能有能力直接把 so 拿过去用就另当别论了
ljbha007
2015-09-03 22:28:02 +08:00
有什么事情是 真正客户端在线的时候能做的 但是模拟的脚本做不到的事情?
ljbha007
2015-09-03 22:32:57 +08:00
按我的经验客户端无论怎样都有办法破解
楼主不妨从产品设计的角度考虑怎么解决这个问题
在线时间对于您的产品本身是没有任何意义的 有意义的是这段在线时间内进行的消费、参与的活动等 不妨用另外的指标来作为发奖品的参考
int64ago
2015-09-03 22:35:50 +08:00
@ljbha007 还是不要过多的揣测产品的用途,“某些”数据是这个产品的核心,可以认为类似在线时间
上面的说法也只是举了个平行的例子
zhicheng
2015-09-03 22:42:45 +08:00
@qiayue 请问我为什么 “不破解安装包获取密钥” 。。。。
@zhicheng strings 大法好。反什么汇编。。。
wy315700
2015-09-03 22:51:15 +08:00
零知识证明

客户端证明有那么多的在线时间。。。

客户端拥有私钥,保存公钥给服务器。
每分钟,服务器发送一个随机数给客户端,客户端把随机数和当前时间戳混合以后,使用私钥签名,发送给服务器。

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

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

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

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

© 2021 V2EX