V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
int64ago
V2EX  ›  程序员

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

  •  
  •   int64ago ·
    int64ago · 2015-09-03 20:24:39 +08:00 · 3040 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    @int64ago 协议很复杂的话不行。现在挂 QQ 都是实体客户端直接挂
    int64ago
        7
    int64ago  
    OP
       2015-09-03 21:52:17 +08:00 via Android
    @iyaozhen 就是你的意思,在线时间换小礼物,心碎 😂
    wuling
        8
    wuling  
       2015-09-03 21:54:55 +08:00   ❤️ 1
    客户端加密密钥 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
        9
    wuling  
       2015-09-03 21:55:51 +08:00
    @wuling a 是客户端和服务器都知道的密钥, k 是加密算法
    int64ago
        10
    int64ago  
    OP
       2015-09-03 21:58:59 +08:00 via Android
    @wuling 对!我刚刚也突然想到这样做
    这个得依赖 APP 抗反编译能力,不过好多了
    zhicheng
        11
    zhicheng  
       2015-09-03 22:01:48 +08:00
    @wuling

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

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

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

    客户端拥有私钥,保存公钥给服务器。
    每分钟,服务器发送一个随机数给客户端,客户端把随机数和当前时间戳混合以后,使用私钥签名,发送给服务器。
    neo2015
        21
    neo2015  
       2015-09-04 09:07:08 +08:00
    接口加密之类的都没用。网上刷安装活跃之类的,都用虚拟机装 APP 。本身就是走的你的接口。

    虚拟机可以模拟设备,传感器, GPS ,更换 IMEI 。防不胜防。
    finian
        22
    finian  
       2015-09-05 18:23:23 +08:00
    没有完美的方案,客户端无论如何都能被(破解)模拟出来,只能想办法增加破解的时间成本
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   742 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:54 · PVG 04:54 · LAX 13:54 · JFK 16:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.