摘要:
做IP归属地查询时,常常能看到归属地正常、却依然被风控拦下。大促期间优惠券被薅空、注册接口涌进一批批小号、订单里混着自动化流量。排查到最后,问题往往不在设备指纹,而在IP本身"不干净"。这篇文章聊IP纯净度:它是什么、从哪几个维度查、代码怎么写,附2026年能直接引用的几组行业数据。
一、为什么IP归属地查询正常,还是被风控盯上?
先给一组数字。Imperva《2026 Bad Bot Report》:机器人流量已占全网流量的53%,恶意机器人占40%,AI驱动的恶意请求在2025年同比涨了12.5倍。放到业务里感受一下,每2.5个请求里,就差不多有1个是程序发的。
很多团队的第一反应是封机房IP。但2026年的攻击者早不住机房了:Radware 2026年Q1对金融机构的监测显示,32%的恶意bot流量来自普通ISP线路而非数据中心;RSA Conference 2026上一项覆盖2.6亿个独立IP的研究也发现,超过半数的活跃风险IP与住宅代理基础设施有重叠。
多数IP归属地查询只能告诉你"它在哪个城市",真正决定一个IP该不该被放行的,是它的纯净度。
二、IP纯净度是什么
说白了,IP纯净度就是IP在网络世界的"信用记录"。干净的IP通常长这样:住宅或移动宽带、没有代理通道标记、不进黑名单、近期没有滥用记录。反过来,机房IP、共享出口、代理通道,或者被拿去刷单、批量注册、跑垃圾流量的,都算"脏"。
三类脏IP,做业务的应该都见过:
- 机房/数据中心IP:地址段公开又集中,是批量下单、批量注册的高发区;
- 共享出口IP:一个出口挂着大量账号,一个账号出事,整段跟着"脏";
- 轮换型代理IP:秒拨、动态住宅,黑名单还没来得及收录,它已经换下一批。
三类常见脏IP示意图
三、从四个维度查纯净度
落到检测上,核心是四个维度:
检测维度 | 查什么 | 典型字段 | 低纯净度特征 |
网络类型 | 住宅/移动还是机房 | usageType / ASN | hosting、数据中心 |
出口通道 | 是否经过代理/隧道 | is_proxy / proxy_type | proxy、vpn、tor、relay |
风险标签 | 是否有历史滥用/欺诈 | risk_level | 中/高风险等级 |
风险评分 | 综合欺诈风险量化 | risk_score(0-100) | 分数偏高 |
除了这四个,真人概率(real)和秒拨概率(mb_rate)也是有用的补充信号:真人概率趋近0说明是机器流量,秒拨概率高说明是轮换代理。
单看任何一个维度都会误判。住宅IP被薅狠了一样会"变脏",机房IP只用来调接口也未必有恶意。四个维度放一起,才接近一个IP的真实风险。
四、两接口把四个维度查全
用Python调查询接口,大概长这样。以IP数据云为例。把归属地/应用场景和风险画像拆在两个接口,配合起来正好覆盖四个维度:
import osimport requests KEY = os.environ.get("IPDATACLOUD_KEY") def query_ip(ip: str) -> dict: """归属地 + 应用场景 + ASN:判断数据中心还是家庭宽带""" url = "https://api.ipdatacloud.com/v2/query" resp = requests.get(url, params={"ip": ip, "key": KEY}, timeout=3) data = resp.json().get("data") or {} return { "scene": data.get("usageType") or data.get("usage_type"), # 数据中心/家庭宽带/企业专线 "asn": data.get("asn"), "isp": data.get("isp"), } def risk_ip(ip: str) -> dict: """风险画像:代理、评分、真人概率、秒拨""" url = "https://api.ipdatacloud.com/v2/risk" resp = requests.get(url, params={"ip": ip, "key": KEY}, timeout=3) data = resp.json().get("data") or {} return { "is_proxy": data.get("is_proxy"), # 是否代理 "proxy_type": data.get("proxy_type"), # Proxy/VPN/Tor/Relay "risk_score": int(data.get("risk_score") or 0), # 0-100 "risk_level": data.get("risk_level"), # 无/低/中/高 "real": int(data.get("real") or 0), # 真人概率 0-99 "mb_rate": int(data.get("mb_rate") or 0), # 秒拨概率 0-100 } def purity_check(ip: str) -> dict: info = {**query_ip(ip), **risk_ip(ip)} # 机房 / 代理通道 / 高分 / 低真人,命中任一先按低纯净度处理 info["risky"] = ( info["scene"] == "数据中心" or bool(info["is_proxy"]) or info["risk_score"] > 70 or info["real"] < 20 ) return info print(purity_check("8.8.8.8"))生产上建议分层:注册、登录、支付、领券这些关键节点实时查询;其余流量先用本地离线库粗筛,不必每个请求都走一次网络往返。
IP纯净度四维检测与分级处置流程图
五、静态黑名单为什么不够用了
黑名单是"事后"工具。IP先干了坏事、被上报,才会被收录。而动态住宅代理的平均生命周期只有 7.8 天,约三分之一只存活一天,等名单更新完,IP早轮换走了。GreyNoise 的研究显示,78% 的恶意会话能规避基于IP信誉的传统检测;也有电商团队复盘过,纯黑名单方案识别率不到四成。
所以这两年风控普遍从静态黑名单转向风险画像:不再问"这个IP有没有案底",而是实时看"它从哪来、是什么类型、正在被用来干什么"。
六、落地建议
- 组合判断,别只盯IP:纯净度+设备指纹+行为序列一起看,IP只是第一道闸;
- 分级处理,别一刀切:低纯净度不直接拒绝,降级到验证码、二次验证,少误伤正常用户;
- 数据要新——选日更的IP情报源,重点看usageType、proxy_type、risk_score这类画像字段,而不是只依赖归属地。
当前市面上有多家服务商提供此类数据(如MaxMind、IPinfo、IP2Location等),也有开源方案(如ip2region)可作离线粗筛,您可根据自身业务量和成本灵活选型或混合部署。
下次再遇到"归属地看着正常、却总被风控拦下"的请求,先查一下它的纯净度。答案大概率就在上面那几个字段里。
数据来源:
- Imperva《2026 Bad Bot Report》
- Radware 2026 Q1金融行业威胁报告
- RSA Conference 2026相关研究
注:IP段与风险状态动态变化,检测阈值请结合自身业务调整