• 砍价活动风控的跟踪记录


    前段时间,突遇滑铁卢的砍价活动可让我头发秃了一大把。

    砍价活动的业务线很简单,APP或小程序参与然后直接邀请微信好友助力,被助力成功后就可以领取限量奖品,先到先得,而账号是跟手机号绑定的。

    总体看来功能也不算复杂,再到上线后的跟踪,前几期活动都没啥大问题。

    但我总觉得有点太顺利了。。。

    终于在开始第四期的活动时,发现一些数据很可疑。

    1,线上监控日志发现很多异常调用接口的请求

    2,存在部分新注册的用户头像一样,虽然手机号不一样

    3,砍价过程中奖品库存数量减少得很快,一个奖品最快2-3分钟就砍完了(砍价主要是邀请新用户)。

    4,活动接入的第三方风控没有预警

    4,发现邀请的新用户助力时间分布间隔非常近

    因为项目开发时就已经考虑了第三方风控,所以首先查看第三方风控的日志记录,发现风控后台的账号(手机号)检测正常,这就有点矛盾了。。。

     第一期数据采集分析

    因为正常流程是在小程序发起的,而且新用户助力需要在小程序登录,所以可以记录到用户的unionId,结合线上被刷接口的日志。

    分析后做了以下优化:

    • 助力请求包含用户的unionId,后端保存该unionId
    • 前端增加第三方的数据埋点

    接着是测试后第五期活动上线,并实时跟踪线上活动效果,发现原本能持续3天活动奖品,当天就被抢完了,这库存减少速度明显着异常,看来是遇到羊毛党了。

    好了,第五期活动一结束就拉着相关人员开会,也算是风控的真正开始。

    第二期风控优化

    通过会议讨论,初步发现:

    1,数据库中约80%的助力记录中没有unionId,小程序最新版本正常助力会传unionId

    2,由于微信小程序更新存在延迟,线上存在部分老版本,故无法回传unionId

    3,部分运营反馈的风险用户,其中部分助力数据显示正常(没有重复的unionid、手机号、ip等)

    4,其中第三方埋点统计的按钮点击次数也与总助力次数相差极大(考虑到用户可能多次点击,正常情况下同一次砍价流程,埋点数>=助力次数)

    5,第三方风控本次活动检测数为上期活动检测数的1/4,即大部分助力绕过了风控平台

    6,由于活动助力仅能在小程序发起,即必定会绑定小程序,而unionId是用户绑定小程序的唯一凭证,所以unionId可以作为助力必传字段

    由于第三方风控可是付费了的!先从这边入手。

    发现当时为了提高性能,后端设计时,仅是在助力页面加载时做了风控效验,助力接口上没有效验。那么羊毛党获取到相关参数后,通过助力接口就可以绕过检测。

    那么是否把风控效验放到助力接口上?

    接着顺便找了几个账号对风控做了准确性测试,发现羊毛党账号中的全部助力用户仅能识别50%的用户为可信用度低,其他均为白名单用户,即返回数据存在误杀。

    如果风控效验放到助力接口上,又不想误杀,第三方风控人员建议我们接入滑块效验,由于接入滑块可能需要更改业务流程,影响性能的同时改动周期比较长(涉及购买合同等等),暂时不考虑。

    分析后做了以下优化:

    • 前端助力接口必传unionId参数,且后端验证unionId是否已存在,不存在则判断用户助力失效,重复unionId用户的助力机会取活动的助力次数上限。
    • 助力用户的IP地址的风控限制,由于切实存在IP地址相同的场景,该值上限可做配置化。
    • 前端优化助力操作的第三方埋点事件(助力成功后才会统计),包括小程序的版本号。
    • 由于效果一般,先去掉第三方风控。

    异常订单处理,后置风控!

    对照第三方埋点数据,通知运营对异常订单不发货,进一步避免损失吧!

    我的头发开始掉了。。。

    接着是测试后第六期活动上线(奖品数量较少),并实时跟踪线上活动效果,发现初期活动奖品的库存减少速度正常,后期库存减少速度异常,半天后活动全部奖品砍完。

    可以看出:初期由于风控使羊毛党用户无法正常砍价,而后期怀疑羊毛党伪造脚本升级导致异常,即上期风控存在效果但还需要持续优化!

    第三期风控优化

    通过会议讨论,初步发现:

    1,用户小程序授权后不进行小程序登录,通过调用app登录接口,获取相关信息后也能进行砍价(漏洞)
    2,而且运营在用户群里面发现了活动帮砍广告,进一步发现羊毛党开发了针对性的砍价工具,缴少许费用后就能帮砍成功(如下图,太嚣张了)
     
     3,后端监控日志发现登录接口被刷,而登录接口与线上活动接口不知何时关闭了验签功能(汗颜) 
     
    针对1漏洞,用户小程序登录的流程分为两步(小程序登录的 官方参考链接 ):
    • 第一步是授权,其中授权后服务端就会保存该用户的unionId,只是此时不生成用户ID。
    • 第二步是登录,老用户授权后自动为登录状态,如果是新用户登录,之前授权的unionId就会与用户ID生成绑定关系。

    所以非法调用APP登录以获取到有效token,就能绕过小程序登录,也能正常助力,但该情况不会生成绑定关系。

    于是助力人的unionId与该用户ID存在绑定关系才能助力成功!

    此外还准备了两个杀手锏,一是页面接口加入身份校验参数A,助力时入参需要把参数A带上;二是助力接口入参PB化(Protobuff),门槛瞬间提高几丈。

    于是整理风控解决方案如下:
    • 针对助力接口,后端需要验证该unionId是否与助力的用户ID是否匹配,匹配正常才能助力。
    • 登录接口与线上活动接口开启验签功能。
    • 助力接口增加身份校验参数,并对接口入参进行PB化。
    • 第三方埋点数据分析,用户砍价存在助力的埋点记录即为正常助力。
    •  异常用户加入砍价黑名单,需要提供往期黑名单用户

    继续异常订单处理!

    和上次一样同步异常订单给运营,运营已经面露难色!

    我的头发掉得更厉害了。。。

    接着是测试后第七期活动上线(奖品数量多,但部分质量较低),并实时跟踪线上活动效果,发现活动共持续了3天,奖品的库存减少速度正常,到活动结束时仍然存在剩余奖品。

    由于第三方数据平台会记录小程序端助力的埋点数据,补充分析如下:

    1,活动完成后,统计第三方埋点数据与总的助力次数,发现99.4%的数据是正常的(埋点统计可能存在误差)——证明风控有较好效果

    2,统计砍价成功的助力数据,如果助力次数<埋点次数,则用户存在砍价异常(埋点统计可能存在误差,5个以内可以接受)。

    注:仅发现一个用户偏差较大(占0.2%),已同步给运营,综合分析后发现该用户的各种砍价行为正常,可能需要再次观察 ——证明风控存在较小风险

    可以看出:活动期间库存减少速度正常,短期内使羊毛党用户无法正常砍价,总体来看这次风控是有效的(部分奖品价值较低,不排除羊毛党没参与本次砍价),所以下期活动可以放开点。

    两天后第八期活动上线!

    本期奖品数量多,但部分质量较低,原计划持续2天的活动仅持续了1天多点,结合反馈,第一天的凌晨后库存减少速度开始异常,用户助力时间分布间隔非常近。

    。。。。。。so风控还需要再次优化!

    第四期风控优化

    通过会议讨论,初步发现:

    1,本期活动所有助力成功用户记录有8万多条。

    2,本期活动所有助力成功记录埋点有7万多条。

    3,本期砍价成功的助力记录为7万多条,与神策次数对比,经过运营统计异常订单占33%。

    4,存在非法用户购买了砍价工具,并发布了帮砍广告。

    通过后台日志分析,发现小程序登录接口调用正常?

    上图为官方说明,我们在前端授权后,服务端会把正确的sessionKey返回给前端(官方提示不能传),如果羊毛党知道正确的OpenIdUnionID及对应的sessionKey,是不是就能反向破解sessionKey了。。。

    能不能破解已经不敢想了,必须马上隐藏sessionKey!!!

    为了兼容老版本,sessionKey做了映射,相当于返回一个假的sessionKey并且每次使用后就会删除映射关系。

    通过会议讨论,考虑到成本、时间与后期规划,解决方案如下:
    1,小程序登录参数秘钥策略调整(sessionKey隐藏)
    2,减少羊毛党砍价速度,同一个用户新用户1分钟助力不得超过5次
    3,人工实时预警,加入黑名单干预用户砍价
    4,购买并分析砍价工具,针对调整

    又是异常订单处理!

    和上次一样不太一样的是,运营开始主动索要异常订单了!

    已经来不及关注头发了。。。

    接着第二天第九期活动上线,活动开始前两小时,库存减少正常,中午开始库存减少异常,原计划持续2天的奖品,半天多奖品全部砍完,so上期风控优化点基本无效。

    第五期风控优化

     通过会议讨论,初步发现:
    1,本期活动本期活动所有助力成功记录第三方埋点有9千多条,约一半的助力记录存在异常。
    2,通过后台日志分析,发现小程序登录接口调用正常,没有出现伪造的调用记录。
    3,之前购买的砍价工具都是后台操作,前端根本看不出来啥,想到羊毛党这方面应该有措施,直接放弃

    先处理异常订单吧!

    有人投诉我们了,运营说,能不能风控前置,避免异常订单!

    头发一抓一大把。。。

    要不考虑下跟第三方埋点平台打通?一条埋点数据对应一次成功助力!

    首先第三方埋点是小程序客户端的按钮事件,非法用户首先得捕捉这个请求,其次得破解第三方埋点的通讯加密,伪造成本那是相当的高,但反过来想想。。。
    我们如果要打通第三方平台
    • 需要第三方提供数据查询或支持数据回传的功能,第三方说都可以的,只不过要加钱。。。
    • 埋点数据会有延迟,实时性不高,意味着可能会花费很长时间去判断一次助力是否正常!
    • 埋点数据会有误差,可能客户端产生4次事件,而第三方收集的数据可能只有3条,2条。
    • 打通第三方平台可能需要产品程度上重新设计。。。
    思来想去,似乎这个工作量与费用不亚于一个新的第三方风控了,怎么办?

    该做的都已经做了,而且调用记录都是正常的!!!

    是不是微信登录第一步授权已经被破解了,所以伪造的都是正常的数据?
    网上一查,也有公司遇到过相同的问题,怀疑wx.login() 获取的临时登录凭证code可以被伪造,但是微信官方也没有给出回答。。。
    有点泄气的我们,通过会议讨论决定:
    1,趁着还有点时间,拾起之前的第三方风控,做滑块校验
     
    但经过对接后发现该风控的滑块校验不支持微信小程序。。。黔驴技穷,由于运营计划的时间成本等原因,也来不及接入其他第三方风控了。

    于是活动暂停,风控以失败告终。。。

    结语:虽然结果难以接受,但也收获了很多,见识了真正的黑产,正所谓道高一尺魔高一丈,以目前的团队还是有点捉襟见肘,慢慢提升自己吧。

  • 相关阅读:
    匿名函数 sorted() filter() map() 递归函数
    内置函数
    生成器
    迭代器
    函数
    Linux系统及lvm知识
    nginx设置成开机自动启动服务
    cinder介绍及使用lvm本地存储
    docker私有仓库的搭建
    工作中涉及运维知识点的汇总
  • 原文地址:https://www.cnblogs.com/qgc1995/p/14224946.html
Copyright © 2020-2023  润新知