Hentikan penipuan pendaftaran dengan 3 pemeriksaan API, tidak perlu captcha
Captcha merugikan konversi dan bot tetap menyelesaikannya. Skor setiap pendaftaran dengan VPN, email sekali pakai, dan pemeriksaan daftar blokir IP kurang dari 120 md, dan hanya tantang 5% teratas.
Bot lebih murah dari anggaran captcha Anda. Solve-farm komersial menyelesaikan reCAPTCHA v2 dengan biaya sekitar $1 per seribu, sehingga scraper yang menginginkan 50.000 akun sekali pakai menghabiskan lebih sedikit uang untuk captcha dibandingkan VPS untuk menjalankan skrip. Sementara itu, pengguna Anda yang sebenarnya berhasil memecahkan teka-teki dengan kecepatan 3 hingga 15%.
Pagar yang lebih baik adalah skor. Tiga panggilan API memberi Anda sinyal yang cukup untuk memungkinkan 95% pendaftaran selesai tanpa hambatan dan menantang atau memblokir bagian yang tersisa. Total latensi di bawah 120ms pada P99.
Tiga sinyal, tiga titik akhir
Setiap pendaftaran memiliki IP dan email. Itu cukup untuk menanyakan tiga pertanyaan sempit.
Apakah IP tersebut berupa VPN, pintu keluar Tor, atau pusat data?
Pendaftaran konsumen nyata jarang berasal dari blok AWS CIDR. Node keluar Tor hampir tidak pernah mendaftar untuk uji coba gratis SaaS Anda. Itu /v1/vpn-detect titik akhir memeriksa ketiganya.
{
"ip": "34.102.55.10",
"is_vpn": true,
"is_tor": false,
"is_datacenter": true,
"provider": "Google Cloud",
"risk_score": 60
}
Apakah email tersebut menggunakan domain sekali pakai?
Penyedia sekali pakai (mailinator, guerrillamail, tempmail) memutar kotak masuk dalam hitungan menit. Jika pendaftaran mengenai domain sekali pakai, pengguna tidak berniat menerima tindak lanjut. /v1/disposable-email/check menandai 700+ penyedia terkenal ditambah pola heuristik.
{
"email": "user@mailinator.com",
"domain": "mailinator.com",
"is_disposable": true,
"is_free": false,
"provider": "Mailinator"
}
Apakah IP berada dalam kisaran bogon atau dalam daftar reputasi?
IP Bogon tidak boleh mencapai server Anda dari internet terbuka; mereka menunjukkan header palsu atau proxy yang rusak. DNS terbalik yang mencurigakan (nama host dengan "proxy", "tor", "spam") adalah cara murah lainnya. /v1/ip-blocklist/check mengembalikan tingkat risiko ditambah perincian per cek.
{
"ip": "185.220.101.5",
"is_private": false,
"is_bogon": false,
"reverse_dns": "tor-exit-1.example.org",
"risk_level": "high"
}
Berat dan skor dalam satu fungsi
Panggil ketiganya secara paralel, tambahkan poin berbobot, jepit ke 100, dan pilih keputusan. Ambang batas dapat disesuaikan per produk; mulai dengan 20 dan 70 sebagai tantangan dan pemotongan blok.
// 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),
};
}
Beberapa catatan tentang bobot. Tor adalah sinyal yang kuat; 80 poin saja menempatkan permintaan ke dalam blok band. IP pusat data menangkap banyak lalu lintas bot tetapi juga melegitimasi pengguna VPN yang selalu aktif, sehingga 50 poin membuat mereka mendapat tantangan, bukan pemblokiran. Email sekali pakai mendapat 60 poin karena pengguna sebenarnya hampir tidak pernah memilih mailinator.
Masukkan ke dalam rute pendaftaran
Lakukan panggilan skor tepat sebelum pembuatan pengguna. Tolak blok band, minta verifikasi email pada band tantangan, biarkan sisanya tidak tersentuh.
// 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 });
}
Audit setiap keputusan
Anda tidak dapat menyetel ambang batas tanpa data. Pertahankan skor dan sinyal mentah pada setiap pendaftaran.
// 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(),
});
Kalibrasi setiap minggu terhadap churn dan penyalahgunaan
Jalankan laporan seminggu sekali. Apakah skor yang lebih tinggi memprediksi churn, tingkat pengembalian dana, atau laporan penyalahgunaan yang lebih tinggi? Jika skor 60 pendaftaran churn sebesar 80% dan skor 10 pendaftaran churn sebesar 4%, bobot Anda dikalibrasi dan Anda dapat memperketat ambang batas blok. Jika gradiennya datar, timbang kembali.
-- 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;
Tujuannya adalah kurva monotonik. Setiap kelompok skor seharusnya mempunyai hasil yang lebih buruk daripada kelompok skor di bawahnya. Jika tidak, tambahkan sinyal (sidik jari perangkat, kecepatan pendaftaran dari /24 yang sama) atau jatuhkan beban yang tidak menarik bebannya sendiri.
Dimana ini cocok vs. captcha
| Mendekati | Gesekan untuk pengguna nyata | Kerugian bagi penyerang | latensi P99 |
|---|---|---|---|
| reCAPTCHA v2 | penurunan 3-15%. | $1 per 1.000 penyelesaian | 300-800 ms |
| Perusahaan hCaptcha | penurunan 2-8%. | $1-2 per 1.000 | 250-600 ms |
| skor 3 sinyal | 0% untuk 95% pengguna | Harus memperoleh IP bersih + kotak surat asli | 80-120 mdtk |
Skor tidak menggantikan captcha saat Anda memerlukan alur login anti bot untuk bank AS. Ini adalah default yang tepat untuk pendaftaran SaaS, buletin, dan gerbang uji coba.
Hal ini tidak tercakup dalam hal ini
- Pengisian kredensial saat login: gunakan kunci sandi atau batas tarif berdasarkan akun.
- Pendaftaran terkoordinasi melonjak dari proxy perumahan: tambahkan batas kecepatan per /24 dan per domain-email-plus-menit pendaftaran.
- Pengguna yang menyelesaikan verifikasi email dengan alamat sekali pakai: menetapkan pembekuan 24 jam pada akses fitur untuk kelompok tantangan.
Dapatkan kunci API dan masukkan
Ambil kunci gratis di botoi.com/api/signup. Tingkat gratis mencakup 1.000 skor per hari, cukup untuk menjalankan kalibrasi terhadap pendaftaran selama seminggu terakhir. Paket berbayar mulai dari $9/bulan untuk 10.000 permintaan per hari.
Referensi lengkap untuk setiap titik akhir: API Deteksi VPN, API Pemeriksaan Email Sekali Pakai, Dan API Pemeriksaan Daftar Blokir IP.
FAQ
- Mengapa tidak menggunakan captcha saja?
- Konversi biaya Captcha (penurunan umum: 3 hingga 15% dari pengguna sebenarnya) dan kumpulan CAPTCHA komersial memecahkan masalah reCAPTCHA v2 dengan harga di bawah $1 per seribu. Mencetak gol dengan sinyal menghilangkan hambatan pada 95% pendaftaran dan hanya menantang bagian yang mencurigakan.
- Sinyal apa yang masuk ke dalam skor?
- Tiga: Tanda IP VPN/Tor/pusat data, domain email sekali pakai atau sekali pakai, dan daftar blokir IP yang masuk (bogon, nama host yang mencurigakan). Masing-masing kembali dalam waktu kurang dari 50 md. Timbang risiko tersebut untuk mendapatkan skor risiko 0-100, lalu tentukan per ambang batasnya.
- Apakah memblokir IP pusat data merugikan pengguna sebenarnya?
- IP perusahaan dan konsumen tidak cocok dengan blok CIDR pusat data. Satu-satunya pengguna nyata yang terpengaruh adalah orang-orang yang menggunakan VPN yang selalu aktif, yang biasanya merupakan minoritas yang dapat Anda arahkan ke jalur verifikasi sekunder daripada langsung memblokirnya.
- Bagaimana cara mengatasi sinyal rendah di tengah?
- Skor di atas 70: blok. Skor di bawah 20: izinkan. Antara 20 dan 70: memerlukan verifikasi email atau peningkatan (kode SMS, kunci sandi). Anda mengalihkan gesekan ke jalur berisiko, bukan ke seluruh corong.
- Bisakah saya menguji skor berdasarkan riwayat pendaftaran?
- Ya. Putar ulang 90 hari terakhir pendaftaran melalui tiga titik akhir, gabungkan skor dengan kolom churn, pengembalian dana, dan laporan penyalahgunaan, dan kalibrasi ambang batas Anda sebelum Anda menerapkan apa pun. Setiap titik akhir tetap stabil pada panggilan berulang dengan masukan yang sama.
Mulai membangun dengan botoi
150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.