前段時間,突遇滑鐵盧的砍價活動可讓我頭發禿了一大把。
砍價活動的業務線很簡單,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地址相同的場景,該值上限可做配置化。
- 前端優化助力操作的第三方埋點事件(助力成功后才會統計),包括小程序的版本號。
- 由於效果一般,先去掉第三方風控。
異常訂單處理,后置風控!
對照第三方埋點數據,通知運營對異常訂單不發貨,進一步避免損失吧!
我的頭發開始掉了。。。
接着是測試后第六期活動上線(獎品數量較少),並實時跟蹤線上活動效果,發現初期活動獎品的庫存減少速度正常,后期庫存減少速度異常,半天后活動全部獎品砍完。
可以看出:初期由於風控使羊毛黨用戶無法正常砍價,而后期懷疑羊毛黨偽造腳本升級導致異常,即上期風控存在效果但還需要持續優化!
第三期風控優化
通過會議討論,初步發現:

- 第一步是授權,其中授權后服務端就會保存該用戶的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返回給前端(官方提示不能傳),如果羊毛黨知道正確的OpenId、UnionID及對應的sessionKey,是不是就能反向破解sessionKey了。。。
能不能破解已經不敢想了,必須馬上隱藏sessionKey!!!
為了兼容老版本,sessionKey做了映射,相當於返回一個假的sessionKey並且每次使用后就會刪除映射關系。
又是異常訂單處理!
和上次一樣不太一樣的是,運營開始主動索要異常訂單了!
已經來不及關注頭發了。。。
第五期風控優化
先處理異常訂單吧!
有人投訴我們了,運營說,能不能風控前置,避免異常訂單!
頭發一抓一大把。。。
要不考慮下跟第三方埋點平台打通?一條埋點數據對應一次成功助力!
- 需要第三方提供數據查詢或支持數據回傳的功能,第三方說都可以的,只不過要加錢。。。
- 埋點數據會有延遲,實時性不高,意味着可能會花費很長時間去判斷一次助力是否正常!
- 埋點數據會有誤差,可能客戶端產生4次事件,而第三方收集的數據可能只有3條,2條。
- 打通第三方平台可能需要產品程度上重新設計。。。