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

微信小游戏 API 接口开发安全问题怎么处理?

  •  
  •   xiaoduoduoduo · 2016-08-24 10:36:54 +08:00 · 4219 次点击
    这是一个创建于 2810 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前两天做的微信小游戏项目。被人一次性用几千个微信号刷走了红包。想问怎么尽量避免这样的问题。之前用的是 MD5 拼接字符串再 MD5 做的验证。已被破解。
    56 条回复    2016-08-26 10:02:29 +08:00
    zhaoxiting1997
        1
    zhaoxiting1997  
       2016-08-24 10:40:22 +08:00   ❤️ 1
    ip 限制,验证码。。。
    有几千个能领红包的活跃号也是大牛了。。。
    fjzjk
        2
    fjzjk  
       2016-08-24 10:45:13 +08:00
    也就只能 ip 限制、验证码之类的了。你去赚客吧看看人家怕什么你就弄什么
    xiaoduoduoduo
        3
    xiaoduoduoduo  
    OP
       2016-08-24 10:55:54 +08:00
    ip 限制的话,同一个路由下的 ip 都是一样。这个怎么解决?验证码的话是实行短信验证还是什么验证?
    xiaoduoduoduo
        4
    xiaoduoduoduo  
    OP
       2016-08-24 10:59:48 +08:00
    @fjzjk 瞄了一下赚客吧。感觉就是用爬虫拿到网上的各种活动信息
    xiaoduoduoduo
        5
    xiaoduoduoduo  
    OP
       2016-08-24 11:00:48 +08:00
    @zhaoxiting1997 感觉怎么都不好做。前端用的是 JS ,什么都暴露出来了。那天一开始统计有刷掉了几千个红包,只有 120 个 IP ,也是醉了
    romotc
        6
    romotc  
       2016-08-24 11:06:24 +08:00
    后台默默限制一个微信号只能拿 1 个红包呗,能有耐心用几千个微信号来刷的其他手段对他们来说意义也不太大吧。
    再不行就微信号、 IP 、验证码限制逐级上,记住所有限制不要在界面明确显示 只要不给红包就好了
    xiaoduoduoduo
        7
    xiaoduoduoduo  
    OP
       2016-08-24 11:11:00 +08:00
    @romotc 这个在商户已经设置一个微信号每天只能领取一个,代码里面限制只能领取一个。真心是用几千个微信号刷走红包的。全部绕开了游戏接口,直接调用红包接口。验证码怎么去验证呢?
    lavande
        8
    lavande  
       2016-08-24 11:11:20 +08:00
    这算是 sybil 攻击吧,解决方法,说宽泛一点就是:增加伪造身份的成本
    justfindu
        9
    justfindu  
       2016-08-24 11:12:47 +08:00
    实名制呀~ 微信红包发出去的时候有一个 check_name 设置强制 check, 然后需要微信用户输入名字就可以了
    romotc
        10
    romotc  
       2016-08-24 11:13:53 +08:00
    @xiaoduoduoduo 红包接口中增加游戏相关验证呗
    “ MD5 拼接字符串再 MD5 ”是什么鬼?
    xiaoduoduoduo
        11
    xiaoduoduoduo  
    OP
       2016-08-24 11:18:25 +08:00
    @lavande 那这个就是属于伪造身份+非同时攻击咯
    xiaoduoduoduo
        12
    xiaoduoduoduo  
    OP
       2016-08-24 11:21:52 +08:00
    @romotc
    //时间判断
    if($type == 'test'){
    $huidiao = time();
    $_SESSION['huidiao'] = $huidiao;
    showsuc('test',array('code'=>md5($huidiao)));
    }

    if(in_array($type,array('接口名称'))){
    if(md5(md5($_SESSION['huidiao']).$_REQUEST['score']) != $_REQUEST['code']){
    showsuc('请求成功');
    }else{
    $_SESSION['huidiao'] = null;
    }
    }
    xiaoduoduoduo
        13
    xiaoduoduoduo  
    OP
       2016-08-24 11:34:10 +08:00
    @lavande 但也不对呀。微信红包是发送到对应的 openid 的,伪造的身份怎么接收红包呀?
    changwei
        14
    changwei  
       2016-08-24 11:36:24 +08:00
    接入复杂验证码,进行分级审查作弊用户,比如说如果复杂验证码仍然承受不了攻击,那么对这个 IP 段实施更高等级的验证,比如说手机验证码,语音验证码, GIF 动态验证码等等,增大作弊成本也不会影响普通真实用户体验。
    williamx
        15
    williamx  
       2016-08-24 11:38:30 +08:00
    这种问题都是从策划上去想办法解决的
    lavande
        16
    lavande  
       2016-08-24 12:15:51 +08:00
    @xiaoduoduoduo 我刚刚说的可能有点问题, sybil 攻击是指在 P2P 网络中发生的……不过我的意思就是,这些“小号”既是合法的身份又是非法的,合法是因为它确实是微信的系统里承认的合法用户,非法是因为它们背后是同一个人在操作,用于非法目的,所以就是想方法让这个人在操纵这些小号去攻击你的时候要花费巨大的成本
    xiaoyangsa
        17
    xiaoyangsa  
       2016-08-24 12:50:03 +08:00
    @xiaoduoduoduo 游戏完成以后加标注,然后才能领红包啊,要不不给领嘛
    leehon
        18
    leehon  
       2016-08-24 13:16:33 +08:00
    现在微信检查的比较严格,即使刷到了红包,要集中并提现也不容易
    alex321
        19
    alex321  
       2016-08-24 13:37:59 +08:00
    游戏进行完成之后才可以领红包是必须的前置条件啊,可以是程序自行承接或者发出一个红包口令啥的。
    每次都走 OAuth 过一遍,针对 openId/unionId 再次通过微信 api 在服务端检查是否保持关注状态,然后针对所有新 openId/unionId 低概率发红包。
    这些是对用户透明无感知的,说到有感知的,直接手机号码短信验证,同一手机号码只允许领一次,都发红包了,不在乎这 0.045 的钱吧。
    xiaoduoduoduo
        20
    xiaoduoduoduo  
    OP
       2016-08-24 13:55:25 +08:00
    @changwei 这个上午又考虑过,在想接下来的项目是不是全部把接口名使用加密后的字符串,发红包的时候做验证比较麻烦
    xiaoduoduoduo
        21
    xiaoduoduoduo  
    OP
       2016-08-24 13:56:11 +08:00
    @williamx 策划。。。完全没有策划的呀。
    xiaoduoduoduo
        22
    xiaoduoduoduo  
    OP
       2016-08-24 13:58:10 +08:00
    @lavande 额,就是你说的这样子。在考虑哈希加密。看到有一个是加密了一百层的,拖住解析的时间
    xiaoduoduoduo
        23
    xiaoduoduoduo  
    OP
       2016-08-24 13:59:55 +08:00
    @wz2520020 销售给客户设计的是在游戏第一关以后发红包。开始也考虑过,然后客户那边拿通过方案了。程序不好说什么。尤其是我是个妹子。销售更加不会听我的建议
    xiaoduoduoduo
        24
    xiaoduoduoduo  
    OP
       2016-08-24 14:00:16 +08:00
    @leehon 有很多合法的账号,拿他没办法
    xiaoduoduoduo
        25
    xiaoduoduoduo  
    OP
       2016-08-24 14:11:04 +08:00
    @alex321 这个的话不用用的客户公众号授权,用的是我们公司的,也就没有这个关注的态度可言。手机短信验证的钱,客户估计会在乎。一个项目三万二,外加每天几万条的短信。一万的红包。这样做一个月推广。不划算
    zhaoxiting1997
        26
    zhaoxiting1997  
       2016-08-24 14:15:15 +08:00 via Android
    @xiaoduoduoduo 同一个路由下 ip 一样有什么问题吗,你就返回一个,此 ip 已领过红包。验证码就是点领红包按钮以后加一个图片验证码啊。
    xiaoduoduoduo
        27
    xiaoduoduoduo  
    OP
       2016-08-24 14:21:09 +08:00
    哦,意思就是说领取过得 ip 地址都再加上一个验证咯
    alex321
        28
    alex321  
       2016-08-24 14:25:20 +08:00
    @xiaoduoduoduo 没有关注的态度可言?没有关注的状态可言?
    那么场景是这么样的?客户是订阅号,你们是服务号。客户是想在自己的订阅号上有个超链接,点进去玩小游戏,然后领红包?然后因为订阅号不能发红包,所以需要通过你们的服务号来做发红包的操作?而订阅号和服务号估计是没有进开放平台,不能用 unionId 来统一标识,只好两边各管各的。

    如果排除短信验证的话,我的建议是这么样:订阅号推活动,让用户发送关键字触发获得包含各自 openId 的独立活动链接,点击链接进入活动。这个步骤可以很有效地保证参加活动的用户是关注状态,有吸粉价值,并且能够直接走微信系统做用户相对客户订阅号合法性的有效验证;当用户不是通过关键字触发进来的时候不允许参加活动,提示需要按照指定的流程来进行。
    小游戏过第一关,反正就是到了该发红包的时候了,程序生成一个唯一串用来做红包验证,这个也没必要给用户知道。然后,包含这个红包领取串 OAuth 跳转到你们公司的服务号,验证红包领取串的合法性后发红包。

    如果这个活动中允许用户分享的话,也很好办,利用你们自己的服务号 js-sdk 去除分享网址中的用户标识就可以了。我们已经做了好多好多这样的事情。。

    如果可行,直接把俩公众号放到开放平台,可以用 unionId 来,方便很多了额。话说,我现在就是这么搞的,全公司所有公众号都拉到开放平台了。。
    gkiwi
        29
    gkiwi  
       2016-08-24 14:34:50 +08:00
    1. 同 IP 领取几率降低,比如同一个 IP ,第一次有 10%几率,第二次有 5%,第三次 2.5%类推;
    2. 能领取的,加上验证码:您已经获得 0.5 元,输入以下验证码领取;
    xiaoduoduoduo
        30
    xiaoduoduoduo  
    OP
       2016-08-24 15:07:44 +08:00
    @alex321 额,这个方法在之后是可以采用的,现在主要问题是直接绕过游戏接口调用的红包接口。他拥有很多合法的 openid 。这个要怎么处理
    xiaoduoduoduo
        31
    xiaoduoduoduo  
    OP
       2016-08-24 15:10:20 +08:00
    @gkiwi 这个红包是由公众号直接派发的,现在发红包一个按钮调用了两个接口,这样下来的会出调用三个接口的,这样会不会卡
    gkiwi
        32
    gkiwi  
       2016-08-24 15:41:14 +08:00
    @xiaoduoduoduo 不会的,现在浏览器同域下,并发请求至少 8 个;
    即使你是同步处理,也不会慢,三个请求很快,实在慢的话,大不了在请求时候加个 loading.gif
    doctli
        33
    doctli  
       2016-08-24 15:52:44 +08:00
    几千个微信号!
    怎么做的
    alex321
        34
    alex321  
       2016-08-24 16:14:34 +08:00
    @xiaoduoduoduo 那就改成我说的形式嘛。。我本身是 PM ,但公司全部的微信开发都是我兼着的,修改这些东西,并不需要多少时间。
    如果一定要在现在的基础上调整,因为我并不清楚你们现在的业务表现,按你说是一个按钮调两个接口,我们拆分一下,先调 A ,然后 A 增加领红包的验证串,在 B 中使用;或者干脆点,让用户输入,通过 B 验证?

    如果真的有想对你们客户订阅号的合法 openId ,你都是合法的了,谁又能怎么样。。这种情形倒是在那些卖运营商卡的人,手头有大量手机号码资源和短信猫池下会出现。
    murusu
        35
    murusu  
       2016-08-24 16:26:23 +08:00
    策划改改就行了
    红包几率获取,游戏可以多次进行,同 id 按获取次数调低几率,同 ip 按获取次数调低几率
    xiaoduoduoduo
        36
    xiaoduoduoduo  
    OP
       2016-08-24 16:45:14 +08:00
    @gkiwi 微信内置浏览器呢?
    xiaoduoduoduo
        37
    xiaoduoduoduo  
    OP
       2016-08-24 16:47:52 +08:00
    @doctli 主管告诉我的,注册一堆微信号并不难,重点是刷红包的人,有工具管理这一大堆微信号
    xiaoduoduoduo
        38
    xiaoduoduoduo  
    OP
       2016-08-24 16:48:39 +08:00
    @alex321 额,反正只求给客户的数据上面好看一点,能加你 QQ 不?我的: 304413139
    xiaoduoduoduo
        39
    xiaoduoduoduo  
    OP
       2016-08-24 16:49:21 +08:00
    @murusu 红包大小是客户定的,每个微信账号领取一次。都是写死了的
    williamx
        40
    williamx  
       2016-08-24 17:11:04 +08:00
    @xiaoduoduoduo 你们不是专门做游戏的吧?那遇到这种事情是很正常的。请教一下做游戏的呗。
    fjzjk
        41
    fjzjk  
       2016-08-24 17:23:59 +08:00
    @xiaoduoduoduo 是的,但是他们中不少人赚的挺多。就是找你们漏洞的
    cenxun
        42
    cenxun  
       2016-08-24 17:31:03 +08:00
    挺好奇怎么会有很多合法的 openid ?这个样子除非是有微信协议~
    jccg90
        43
    jccg90  
       2016-08-24 17:38:00 +08:00
    都是 js 的代码,游戏怎么设计都没用。。。现在比较有用的也就是图片验证码+手机验证码+ip 限制。。。还有就是把红包改成概率的,然后验证做的隐蔽一些,让人不知道是因为概率没有拿到红包还是因为被反作弊检测到了
    gkiwi
        44
    gkiwi  
       2016-08-24 18:32:24 +08:00
    @xiaoduoduoduo 一样的
    xiaoduoduoduo
        45
    xiaoduoduoduo  
    OP
       2016-08-24 20:04:45 +08:00
    @williamx 不是,就我点背,一遇到这样的项目都是在我做后台,然后就被刷
    xiaoduoduoduo
        46
    xiaoduoduoduo  
    OP
       2016-08-24 20:05:26 +08:00
    @cenxun 不知道是怎么做到的,天天注册吧
    cenxun
        47
    cenxun  
       2016-08-24 20:46:07 +08:00
    @xiaoduoduoduo 除了注册还有很多事情的,比如访问你们项目带上 openid ,得模拟一些正常的使用行为
    mingyun
        48
    mingyun  
       2016-08-24 22:27:52 +08:00
    能否验证微信账号是否绑定银行卡
    iamjs
        49
    iamjs  
       2016-08-25 08:49:17 +08:00
    说实话,如果你的用户机制是可靠的话。。几千个微信就是真实的。。。那你的目的不就达到了?还有什么问题呢。。
    GavinJ
        50
    GavinJ  
       2016-08-25 09:47:04 +08:00
    这分明就是羊毛党, 通过你的规则漏洞大批量去刷。 这个很正常啊,而不是你程序的问题。
    我们平台做 p2p 的,在做线上活动的时候也曾遇到过类似的问题。 当知道被刷的时候没办法,由于活动规则就定好了,只能眼睁睁的看着被刷。
    xiaoduoduoduo
        51
    xiaoduoduoduo  
    OP
       2016-08-25 15:36:20 +08:00
    @mingyun 这个就没必要了吧,而且不一定有这个权限
    xiaoduoduoduo
        52
    xiaoduoduoduo  
    OP
       2016-08-25 15:36:42 +08:00
    @cenxun openid 都是有的
    xiaoduoduoduo
        53
    xiaoduoduoduo  
    OP
       2016-08-25 15:37:40 +08:00
    @iamjs 关键是他会绕过游戏接口直接请求红包接口,到现在都还在狂请求接口
    xiaoduoduoduo
        54
    xiaoduoduoduo  
    OP
       2016-08-25 15:43:46 +08:00
    @GavinJ 他能绕靠我接口里面所有的判断,简直是哔了狗啦
    qfdk
        55
    qfdk  
       2016-08-25 22:07:04 +08:00 via iPhone
    求思路 我也去抢红包
    xiaoduoduoduo
        56
    xiaoduoduoduo  
    OP
       2016-08-26 10:02:29 +08:00
    @qfdk 简单的我也能抢,像这种完全不知道是怎么做到的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2389 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:00 · PVG 18:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.