微信小程序中登录 code 可以“伪造”? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
请用平和的语言准确描述你所遇到的问题
厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
Snailzzz

微信小程序中登录 code 可以“伪造”?

  •  1
     
  •   Snailzzz 2019 年 6 月 20 日 11910 次点击
    这是一个创建于 2501 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天晚上 21 点 34 分左右,服务器涌入大量请求,这些请求的 UA 完全一致

     'user-agent' => 'Mozilla/5.0 (Linux; Android 6.0.1; C106 Build/ZAXCNFN5902606201S; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044304 Mobile Safari/537.36 MicroMessenger/6.6.7.1321(0x26060739) NetType/WIFI Language/zh_CN' 

    很奇怪,主要有一下几点疑问

    • 这些接口调用微信小程序内部的 login 方法得到了 Code,通过 Code 可以在微信 API 接口中获取到 OpenID,没有发生错误。
    • 上条是否可以判定这些 Code 就是正确的 Code?
    • 如果可以判定这些 Code 是正确的 Code,在一分钟内发送了大概 1w+的 Code 并且获取到了 OpenID,但这些所有的请求的 UA 完全一致,并且使用了‘ x-forwarded-for ’伪造了 IP。

    截图

    以我的猜测,这些 Code 确实是正确的 Code,但是可能是从 Q 控 /X 议里面批量得到的,然后某些人收购 Code,通过这些 Code 批量请求

    目前的解决方案,增加用户授权的操作,通过微信的 wx.getUserInfo 方法中 encryptedData 返回值判断。

    这种方法增加了用户的操作,整体流程繁琐了,不知道大家有没有什么好的解决办法。

    第 1 条附言    2019 年 6 月 20 日
    在微信 mp 后台的统计数据中中并没有发现流量激增数据
    第 2 条附言    2019 年 6 月 20 日
    关于怀疑是爬虫的我统一回复一下大家,这些请求是访问了项目的业务 API 的,并不是爬虫
    35 条回复    2019-08-18 21:17:21 +08:00
    uqf0663
        1
    uqf0663  
       2019 年 6 月 20 日
    既然 code 都能搞到了,getUserInfo 又有啥难度?
    Snailzzz
        2
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @uqf0663 你说的也有道理,感觉快要崩溃了,这样搞
    shoaly
        3
    shoaly  
       2019 年 6 月 20 日
    这还挺神奇的, 如何可以批量获取到 code 呢..
    Snailzzz
        4
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @shoaly 我也是很奇怪,这些 Code 都可以在微信 API 中获取到 OpenID,这些 OpenID 还都是不重复的
    csys
        5
    csys  
       2019 年 6 月 20 日 via Android
    不知道是你语言有问题还是我理解能力有问题

    这些接口调用微信小程序内部的 login 方法得到了 Code

    你不是已经知道 code 怎么来的了么
    Snailzzz
        6
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @csys 抱歉,我表达有点不清楚,这些 Code 从正常流程来说,是微信小程序的开放方法 Login 获取到的,然后发送给后端,后端拿这个 Code 去微信那里请求获得 OpenID 等信息,但是同时这么多 Code 并且请求项目的后端的 UA 完全一致,小程序统计那里也没有人数的剧增
    uqf0663
        7
    uqf0663  
       2019 年 6 月 20 日
    @csys 不是,通常这个 code 是用户手动进入小程序 wx.login 时获得的,楼主的意思是对方使用了诸如破解协议之类的手段自动化获取
    leo108
        8
    leo108  
       2019 年 6 月 20 日
    只要羊毛足够大,能调动万把微信号来薅羊毛的黑产多得是
    Snailzzz
        9
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @leo108 除了增加他们薅的难度,没有杜绝的方法了吗。。
    leo108
        10
    leo108  
       2019 年 6 月 20 日
    yushiro
        11
    yushiro  
       2019 年 6 月 20 日 via iPhone
    我记得微信的文档里面是不建议把 openid 下发给客户端的,如果按照文档这样做,这个批量请求就没有价值了
    Snailzzz
        12
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @yushiro 我没有下发客户端,存了数据库之后下发的是项目自定义的一个 SessionId
    miaotaizi
        13
    miaotaizi  
       2019 年 6 月 20 日 via iPhone
    所以手机号什么的还是有必要的
    Snailzzz
        14
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @miaotaizi 如果加了手机号整体流程就太拖沓了
    Snailzzz
        15
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @leo108 验证码的话流程太拖沓,不知道活动反欺诈服务这个是不是免费提供,感觉这种服务价格都挺高的
    uqf0663
        16
    uqf0663  
       2019 年 6 月 20 日
    @shoaly 一点也不神奇,关键词“微信 ipad 协议”“微信安卓协议”有各种成品推广的软文,还有某些免费的试用版,可以自动批量聊天、管理群、加人、发红包抢红包、爬取朋友圈、公众号等各种原本是加密跟各种鉴权的操作。简单总结就是他们通过反编译微信的客户端,然后模拟微信客户端的各种操作。基于此自动获取小程序的 code 也不是啥难事,我猜测小程序的 code 的生成大概有两种可能,一种是本地通过特定的加密方式把一些信息加密,而微信的服务端解密得到这些信息再通过开发者的接口请求返回,另外一种是直接请求微信的服务端得到这个 code。。。无论哪一种看起来破解难度都很低。
    Snailzzz
        17
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @uqf0663 因为我之前接触过 Ipad/安卓 X 议,所以我感觉这是唯一一种可能了,我只是也是感觉 getUserInfo 相对于获取 Code 难度更高点而已
    uqf0663
        18
    uqf0663  
       2019 年 6 月 20 日
    @Snailzzz 如果是使用触控精灵之类的东西实现的,小程序统计肯定有数据,如果小程序统计那里也没有人数的剧增,那 100%就是破解协议了。
    Snailzzz
        19
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @uqf0663 小程序统计那里是没有相关的趋势数据的,
    uqf0663
        20
    uqf0663  
       2019 年 6 月 20 日
    @Snailzzz 在不破坏用户体验(例如加各种交互性的验证)的前提下,想要拦住协议或者触控精灵类的东西基本不可能。
    johz
        21
    johz  
       2019 年 6 月 20 日
    很正常,微信官方爬虫
    hnch201414
        22
    hnch201414  
       2019 年 6 月 20 日
    加个验证码的操作吧~
    dove1011
        23
    dove1011  
       2019 年 6 月 20 日
    可能是微信官方爬虫
    Felldeadbird
        24
    Felldeadbird  
       2019 年 6 月 20 日
    按楼主的说法,code 都验证过,UA 一致。应该是被羊毛党盯上了吧。 试下统计 UA,短时间统一台 UA 要求机器人识别。
    Lax
        25
    Lax  
       2019 年 6 月 20 日
    既然是小程序,UA 全都是微信浏览器不是挺正常的吗?
    z0ne
        26
    z0ne  
       2019 年 6 月 20 日
    检查一下你的小程序调用的第三方 sdk 或者库的安全性。。

    目前我的 sdk 都是放 github 上开源的,就是为了让开发者用的安心。 有的黑心 sdk 还是压缩混淆加密的,就是为了暗地里做些勾当。。

    比如楼主这种情况,如果是第三方库,可以随时获取服务端的命令(获取 code )然后发送回服务端,这样对方就有了大量的 code~~
    Snailzzz
        27
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @z0ne 这个不太可能 这些请求的最终得到的 OpenID 都是新的
    z0ne
        28
    z0ne  
       2019 年 6 月 20 日
    @Snailzzz 这就奇怪了,莫非是算法被逆向了 保持关注
    anteros
        29
    anteros  
       2019 年 6 月 20 日
    我怀疑你的的 code 或者 openid 下发到客户端了。又或者是员工测试暴露了,或者是数据库已经被人拿了
    Snailzzz
        30
    Snailzzz  
    OP
       2019 年 6 月 20 日
    @php01 这种低级的错误不可能的,已经报告官方了,他们回复的是安全相关的同学在排查了
    AbrahamGreyson
        31
    AbrahamGreyson  
       2019 年 7 月 16 日
    @Snailzzz 后续怎么样了,十分关注这件事,最终是如何防刷的。
    Snailzzz
        32
    Snailzzz  
    OP
       2019 年 7 月 26 日
    @AbrahamGreyson 最终我们加上了授权登录 可以验证一下 官方态度一直很消极 最终也没有提出解决办法
    mrvv
        33
    mrvv  
       2019 年 8 月 17 日 via iPhone
    找到原因了吗,我很想知道伪造 code 是否存在
    Snailzzz
        34
    Snailzzz  
    OP
       2019 年 8 月 18 日
    @mrvv 确实是存在的 应该是编译出微信的 xy 或者通过 hook 实现的
    mrvv
        35
    mrvv  
       2019 年 8 月 18 日 via iPhone
    那你知不知道 code 产生的请求方法,按理说一个真实的微信才会产生一个真实的 code 啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3048 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 76ms UTC 02:25 PVG 10:25 LAX 19:25 JFK 22:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86