通过 3 项 API 检查阻止注册欺诈,无需验证码
验证码会损害转化率,而机器人无论如何都会解决它们。 使用 VPN、一次性电子邮件和 IP 阻止列表检查在 120 毫秒内对每个注册进行评分,并且仅挑战前 5%。
机器人比您的验证码预算便宜。 商业解决农场以大约每千人 1 美元的价格清除 reCAPTCHA v2,因此想要 50,000 个一次性帐户的爬虫在验证码上的花费比在运行脚本的 VPS 上花费的要少。 与此同时,真正的用户会以 3% 到 15% 的速度摆脱谜题。
更好的栅栏就是一个分数。 三个 API 调用可为您提供足够的信号,让 95% 的注册顺利通过,并质疑或阻止剩余的部分。 P99 上的总延迟低于 120 毫秒。
三个信号,三个端点
每个注册都有一个 IP 和一个电子邮件。 这足以提出三个狭隘的问题。
IP 是 VPN、Tor 出口还是数据中心?
真正的消费者注册很少源自 AWS CIDR 块。 Tor 退出节点几乎从不注册 SaaS 的免费试用版。 这 /v1/vpn-detect 端点检查所有三个。
{
"ip": "34.102.55.10",
"is_vpn": true,
"is_tor": false,
"is_datacenter": true,
"provider": "Google Cloud",
"risk_score": 60
}
该电子邮件是否使用一次性域名?
一次性提供商(邮件程序、游击邮件、临时邮件)可在几分钟内轮换收件箱。 如果注册到达一次性域,则用户无意接收后续信息。 /v1/disposable-email/check 标记 700 多个已知提供商以及启发式模式。
{
"email": "user@mailinator.com",
"domain": "mailinator.com",
"is_disposable": true,
"is_free": false,
"provider": "Mailinator"
}
该 IP 是否在 bogon 范围内或在信誉列表中?
Bogon IP 永远不应从开放互联网到达您的服务器; 它们指示欺骗标头或损坏的代理。 可疑的反向 DNS(主机名带有“代理”、“tor”、“垃圾邮件”)是另一个廉价的手段。 /v1/ip-blocklist/check 返回风险级别以及每项检查的详细信息。
{
"ip": "185.220.101.5",
"is_private": false,
"is_bogon": false,
"reverse_dns": "tor-exit-1.example.org",
"risk_level": "high"
}
权重和分数在一个函数中
并行调用所有三个,添加加权点,限制为 100,然后选择一个判决。 每个产品的阈值都是可调的; 从 20 和 70 开始作为挑战和块削减。
// signup-score.ts
type Verdict = 'allow' | 'challenge' | 'block';
export async function scoreSignup(input: {
ip: string;
email: string;
}): Promise<{ score: number; verdict: Verdict; signals: Record<string, unknown> }> {
const [vpn, email, blocklist] = await Promise.all([
fetch('https://api.botoi.com/v1/vpn-detect', postJson({ ip: input.ip })).then(r => r.json()),
fetch('https://api.botoi.com/v1/disposable-email/check', postJson({ email: input.email })).then(r => r.json()),
fetch('https://api.botoi.com/v1/ip-blocklist/check', postJson({ ip: input.ip })).then(r => r.json()),
]);
let score = 0;
if (vpn.is_tor) score += 80;
else if (vpn.is_datacenter) score += 50;
else if (vpn.is_vpn) score += 35;
if (email.is_disposable) score += 60;
else if (email.is_free) score += 10;
if (blocklist.risk_level === 'high') score += 40;
else if (blocklist.risk_level === 'medium') score += 20;
const verdict: Verdict = score >= 70 ? 'block' : score >= 20 ? 'challenge' : 'allow';
return { score: Math.min(score, 100), verdict, signals: { vpn, email, blocklist } };
}
function postJson(body: unknown): RequestInit {
return {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: \`Bearer \${process.env.BOTOI_API_KEY}\`,
},
body: JSON.stringify(body),
};
}
关于权重的一些注释。 Tor 信号较强; 仅 80 分就可以将请求纳入封锁范围。 数据中心 IP 捕获大量机器人流量,但也捕获合法的始终在线 VPN 用户,因此 50 分会让他们面临挑战,而不是阻止。 一次性电子邮件得 60 分,因为真正的用户几乎从不选择邮寄者。
将其连接到注册路径中
将分数调用放在用户创建之前。 拒绝阻止带,要求对挑战带进行电子邮件验证,允许其余部分不受影响。
// app/api/signup/route.ts (Next.js)
import { NextResponse } from 'next/server';
import { scoreSignup } from '@/lib/signup-score';
export async function POST(req: Request) {
const body = await req.json();
const ip = req.headers.get('x-forwarded-for')?.split(',')[0] ?? '0.0.0.0';
const result = await scoreSignup({ ip, email: body.email });
if (result.verdict === 'block') {
await auditLog({ type: 'signup.blocked', ip, email: body.email, score: result.score });
return NextResponse.json({ error: 'signup_rejected' }, { status: 403 });
}
const user = await createUser({
email: body.email,
password: body.password,
requiresEmailVerification: result.verdict === 'challenge',
riskScore: result.score,
});
return NextResponse.json({ user });
}
审核每一个决定
没有数据就无法调整阈值。 每次注册时保留分数和原始信号。
// Persist the score and signals with the user row for later calibration.
await db.signupAudit.insert({
userId: user.id,
ip,
score: result.score,
verdict: result.verdict,
signals: result.signals,
createdAt: new Date(),
});
每周针对流失和滥用进行校准
每周运行一次报告。 分数越高是否预示着更高的流失率、退款率或滥用报告? 如果得分为 60 的注册用户流失率为 80%,得分为 10 的注册用户流失率为 4%,则您的权重已校准,您可以收紧阻止阈值。 如果梯度平坦,则重新加权。
-- rerun weekly: does the score predict churn and abuse?
SELECT
FLOOR(score / 10) * 10 AS score_bucket,
COUNT(*) AS signups,
ROUND(100.0 * SUM(CASE WHEN churned THEN 1 ELSE 0 END) / COUNT(*), 1) AS churn_pct,
ROUND(100.0 * SUM(CASE WHEN abuse_reported THEN 1 ELSE 0 END) / COUNT(*), 1) AS abuse_pct
FROM signup_audit
WHERE created_at > NOW() - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;
目标是单调曲线。 每个分数桶的结果应该比它下面的分数桶的结果更差。 如果没有,请添加一个信号(设备指纹、来自同一 /24 的注册速度)或删除一个不会拉动自身重量的权重。
这与验证码比较适合的地方
| 方法 | 真实用户的摩擦力 | 攻击者的成本 | P99 延迟 |
|---|---|---|---|
| 验证码 v2 | 下降 3-15% | 每解决 1,000 个问题 1 美元 | 300-800毫秒 |
| hCaptcha 企业版 | 下降 2-8% | 每 1,000 人 1-2 美元 | 250-600毫秒 |
| 3 信号评分 | 95% 的用户为 0% | 必须获得干净的IP+真实的邮箱 | 80-120毫秒 |
当您需要美国银行的防机器人登录流程时,分数不能取代验证码。 这是 SaaS 注册、新闻通讯和试用通道的正确默认值。
这不包括什么
- 登录时填充凭据:按帐户使用密钥或速率限制。
- 协调住宅代理的注册激增:添加每 /24 和每电子邮件域加注册分钟的速度限制。
- 使用一次性地址完成电子邮件验证的用户:为挑战组设置 24 小时冻结功能访问。
获取 API 密钥并将其放入
获取免费钥匙 botoi.com/api/signup。 免费套餐每天涵盖 1,000 个分数,足以对最近一周的注册进行校准。 付费计划起价为每月 9 美元,每天可处理 10,000 个请求。
每个端点的完整参考: VPN 检测 API, 一次性电子邮件检查 API, 和 IP 阻止列表检查 API。
FAQ
- 为什么不使用验证码呢?
- 验证码成本转换(典型下降:真实用户的 3% 到 15%)和商业验证码农场以每千人不到 1 美元的价格解决 reCAPTCHA v2。 使用信号进行评分可以避免 95% 的注册者遇到的麻烦,并且只挑战可疑的部分。
- 乐谱中包含哪些信号?
- 三:VPN/Tor/数据中心 IP 标志、一次性或一次性电子邮件域以及 IP 阻止列表命中(bogons、可疑主机名)。 每个返回时间都在 50 毫秒以内。 对它们进行加权以获得 0-100 的风险评分,然后根据阈值进行决定。
- 阻止数据中心 IP 是否会伤害真实用户?
- 企业和消费者 IP 与数据中心 CIDR 块不匹配。 唯一受影响的真正用户是使用始终在线 VPN 的用户,这通常是少数,您可以将其路由到辅助验证路径,而不是直接阻止。
- 如何处理中间的低信号?
- 分数高于70:阻止。 分数低于20:允许。 20 到 70 之间:需要电子邮件验证或升级(短信代码、密钥)。 您将摩擦力转移到风险带上,而不是整个漏斗上。
- 我可以根据历史注册测试得分吗?
- 是的。 通过三个端点重播过去 90 天的注册情况,将分数与流失、退款和滥用报告列结合起来,并在执行任何操作之前校准阈值。 每个端点在使用相同输入的重复调用中保持稳定。
开始使用 botoi 构建
150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。