Skip to content

电商防刷单实操:我用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]) > limit

10分钟内同一个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