Appearance
电商防刷单实操:我用IP数据拦住了大部分羊毛党
朋友的店做了一次秒杀活动,结果开抢一小时,注册了三千多个"新用户",成交量却几乎没有。一查,全是批量脚本刷的。他问我怎么办,我说:先看看这些号的IP。
最后我们靠一套简单的IP风控,把刷单量压掉了大部分。今天把这套方案拆开讲。
刷单的人长什么样
羊毛党和刷单脚本有几个典型特征,用IP一眼就能看出来:
- 同一个IP注册几十上百个号(人手没那么多IP);
- IP是机房/IDC类型(脚本跑在云服务器上,不是家里宽带);
- IP归属地和填写的收货地址对不上(人在上海,IP却在河南某机房)。
这三条,每一条都能当判据。
落地:三层判断
第1层:同IP注册频率
最简单的规则。记录每个IP在时间窗口内注册/下单的次数:
python
from collections import defaultdict
import time
# 记录 ip -> [(时间戳, 行为)]
register_log = defaultdict(list)
def is_frequent(ip, window=600, limit=5):
now = time.time()
register_log[ip] = [t for t in register_log[ip] if now - t < window]
register_log[ip].append(now)
return len(register_log[ip]) > limit10分钟内同一个IP注册超过5次,直接进人工复核或者拦截。
第2层:IP类型判断
配合接口返回的 ip_type,把机房IP单独处理:
python
def ip_risk_level(info):
if not info:
return "unknown"
if info.get("ip_type") == "IDC":
return "high" # 机房IP,重度可疑
if info.get("ip_type") == "BUS":
return "medium" # 企业专线,谨慎
return "low" # 家庭宽带,正常很多脚本跑在云服务器上,这层的命中率很高。
第3层:归属地与收货地址比对
用户填的收货地址和IP归属地对不上,也是常见信号:
python
def address_match(ip_prov, address):
if not ip_prov or "省" not in address and ip_prov in address:
return True
return ip_prov in address这个不能一票否决(比如人在外地出差、代收),但可以加权重,作为综合评分的一部分。
综合评分模型
别用单一规则一棒子打死,用打分制更稳妥:
python
def risk_score(ip_info, register_count, address_match_ok):
score = 0
if ip_info and ip_info.get("ip_type") == "IDC":
score += 60
if register_count > 3:
score += 30
if not address_match_ok:
score += 20
return score
# score>80 拦截;50-80 弹验证码;<50 放行拦截方式也有讲究:
- 80分以上:直接拒绝注册/下单;
- 50~80分:弹滑块验证码,把脚本挡在外面,真人能过;
- 50分以下:正常放行。
效果怎么样
我们这套跑下来,刷单注册量降了七成左右,误伤很少——因为家庭宽带的正常用户,ip_type是ISP,本来就打不了高分。配合人机验证,基本就稳了。
别忘了这些
- 查询要缓存:防刷场景下请求量很大,务必加缓存(参考我"高并发缓存限流"那篇)。
- IP只是信号之一:别只靠IP。配合设备指纹、行为数据,效果才完整。IP负责"粗筛",其他负责"精判"。
- 数据要脱敏:保存IP记得做合规处理,别裸存当业务数据用。
写在最后
防刷单没有银弹,但IP维度是性价比最高的一层。用免费接口先搭起来,等流量真大了再升级VIP、再加私有化部署,是大多数中小电商的正确路径。
用到的接口:https://www.ip9.com.cn