VPN dan API deteksi proxy: menandai penyalahgunaan tanpa memblokir pengguna
Deteksi koneksi VPN, proxy, Tor, dan pusat data dengan satu permintaan POST. Termasuk middleware Next.js, pembatasan tarif Express, dan contoh penilaian penipuan.
Aplikasi SaaS Anda menawarkan uji coba gratis per pengguna. Pengguna mendaftar, mengaktifkan VPN, dan mendaftar lagi. Penyalahgunaan promo merugikan pendapatan Anda dan merusak metrik konversi Anda. Anda perlu menandai VPN dan proxy koneksi pada saat pendaftaran.
Panduan ini mencakup botoi POST /v1/vpn-detect titik akhir: apa yang dikembalikan, bagaimana caranya
mengintegrasikannya ke dalam aplikasi Next.js dan Express, cara menggabungkannya dengan sinyal penipuan lainnya, dan di mana
itu gagal.
Titik akhir
Satu permintaan POST dengan alamat IP di badan. Tidak ada header khusus, tidak diperlukan kunci API akses anonim.
curl -X POST https://api.botoi.com/v1/vpn-detect \\
-H "Content-Type: application/json" \\
-d '{ "ip": "185.220.101.1" }'
Respons untuk simpul keluar Tor yang diketahui:
{
"success": true,
"data": {
"ip": "185.220.101.1",
"is_vpn": true,
"is_proxy": false,
"is_tor": true,
"is_datacenter": false,
"provider": null,
"risk_score": 90,
"checks": {
"tor": true,
"datacenter": false,
"suspicious_hostname": false
}
}
}
Tanggapan untuk IP perumahan yang bersih:
{
"success": true,
"data": {
"ip": "73.162.45.118",
"is_vpn": false,
"is_proxy": false,
"is_tor": false,
"is_datacenter": false,
"provider": null,
"risk_score": 0,
"checks": {
"tor": false,
"datacenter": false,
"suspicious_hostname": false
}
}
}
Bidang respons
- is_vpn (boolean): Benar jika IP termasuk dalam rentang pusat data yang diketahui atau memiliki nama host DNS terbalik yang mencurigakan yang berisi kata kunci terkait VPN.
- is_proxy (boolean): Benar jika nama host DNS terbalik menyarankan server proxy.
- is_tor (boolean): Benar jika IP cocok dengan simpul keluar Tor yang diketahui.
- is_datacenter (boolean): Benar jika IP termasuk dalam rentang CIDR AWS, Google Cloud, Azure, DigitalOcean, atau Linode.
- penyedia (string atau null): Nama penyedia cloud kapan
is_datacenteritu benar. Null untuk IP perumahan dan Tor. - skor_risiko (angka, 0-100): Koneksi Tor mendapat skor 90, IP pusat data mendapat skor 60, nama host yang mencurigakan mendapat skor 40. IP perumahan bersih mendapat skor 0.
- pemeriksaan (objek): Perincian metode deteksi mana yang dipicu, untuk debugging.
Tandai pengguna VPN saat mendaftar dengan middleware Next.js
Middleware ini mencegat permintaan POST ke rute pendaftaran Anda, memeriksa IP pemanggil terhadap API deteksi VPN, dan melampirkan header ke permintaan ketika VPN terdeteksi. Pengendali pendaftaran Anda membaca tajuk dan memutuskan apa yang harus dilakukan: memerlukan verifikasi email, menambahkan tanda tinjauan manual, atau mengurangi masa percobaan.
import { NextRequest, NextResponse } from 'next/server';
const VPN_DETECT_URL = 'https://api.botoi.com/v1/vpn-detect';
export async function middleware(req: NextRequest) {
if (req.method !== 'POST') {
return NextResponse.next();
}
const ip = req.headers.get('x-forwarded-for')?.split(',')[0]?.trim()
|| req.ip
|| '127.0.0.1';
try {
const res = await fetch(VPN_DETECT_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ip }),
signal: AbortSignal.timeout(3000),
});
const { data } = await res.json();
if (data.is_vpn || data.is_tor || data.is_proxy) {
// Add a header so your signup handler can flag the account
const response = NextResponse.next();
response.headers.set('x-vpn-detected', 'true');
response.headers.set('x-vpn-risk-score', String(data.risk_score));
return response;
}
} catch {
// Fail open: if the API is unreachable, let the request through
console.warn('VPN detection check failed, allowing request');
}
return NextResponse.next();
}
export const config = {
matcher: ['/api/auth/signup', '/api/auth/register'],
};
Middleware tidak memblokir pendaftaran. Ini meneruskan sinyal ke pawang Anda. Ini adalah haknya pendekatan ini karena lalu lintas VPN bukanlah bukti penipuan. Pengguna yang menggunakan VPN perusahaan atau sedang bepergian melalui jaringan terbatas adalah pelanggan yang sah.
Batasan tarif yang lebih ketat untuk IP VPN di Express
Jika Anda menjalankan API, Anda dapat menerapkan batas kecepatan yang lebih ketat pada koneksi VPN dan proxy tanpa pemblokiran mereka secara langsung. Middleware ini memberi pengguna standar 100 permintaan per jam dan pengguna VPN 20.
import type { Request, Response, NextFunction } from 'express';
const VPN_DETECT_URL = 'https://api.botoi.com/v1/vpn-detect';
const BOTOI_API_KEY = process.env.BOTOI_API_KEY;
// Standard limits
const STANDARD_LIMIT = 100; // requests per hour
const VPN_LIMIT = 20; // requests per hour for VPN users
const requestCounts = new Map<string, { count: number; resetAt: number }>();
export async function vpnAwareRateLimit(
req: Request,
res: Response,
next: NextFunction
) {
const ip = req.headers['x-forwarded-for']?.toString().split(',')[0]?.trim()
|| req.socket.remoteAddress
|| 'unknown';
let isVpn = false;
try {
const vpnRes = await fetch(VPN_DETECT_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': \`Bearer \${BOTOI_API_KEY}\`,
},
body: JSON.stringify({ ip }),
signal: AbortSignal.timeout(2000),
});
const { data } = await vpnRes.json();
isVpn = data.is_vpn || data.is_tor || data.is_proxy;
} catch {
// Fail open: use standard limits if detection fails
}
const limit = isVpn ? VPN_LIMIT : STANDARD_LIMIT;
const now = Date.now();
const entry = requestCounts.get(ip);
if (!entry || entry.resetAt < now) {
requestCounts.set(ip, { count: 1, resetAt: now + 3600_000 });
res.setHeader('X-RateLimit-Limit', limit);
return next();
}
entry.count++;
if (entry.count > limit) {
return res.status(429).json({
error: 'Rate limit exceeded',
retryAfter: Math.ceil((entry.resetAt - now) / 1000),
});
}
res.setHeader('X-RateLimit-Limit', limit);
res.setHeader('X-RateLimit-Remaining', limit - entry.count);
next();
}
Rasio 5:1 antara batas standar dan batas VPN adalah titik awal. Sesuaikan berdasarkan pelecehan Anda pola. Jika API Anda menangani pembayaran atau modifikasi akun, batasan VPN yang lebih ketat adalah hal yang masuk akal. Untuk titik akhir baca-saja, Anda mungkin tidak memerlukan batas diferensial sama sekali.
Penilaian penipuan: menggabungkan deteksi VPN dengan sinyal lain
Deteksi VPN saja merupakan sinyal penipuan yang lemah. VPN + email sekali pakai + akun baru + gagal upaya pembayaran adalah sinyal yang kuat. Fungsi ini menggabungkan beberapa masukan menjadi satu penipuan skor.
interface FraudSignals {
vpnDetected: boolean;
riskScore: number;
disposableEmail: boolean;
accountAge: number; // days
failedPayments: number;
}
function calculateFraudScore(signals: FraudSignals): number {
let score = 0;
// VPN/proxy risk contributes up to 30 points
if (signals.vpnDetected) {
score += Math.round(signals.riskScore * 0.3);
}
// Disposable email: strong signal
if (signals.disposableEmail) {
score += 35;
}
// New account + VPN is a red flag
if (signals.accountAge < 1 && signals.vpnDetected) {
score += 20;
}
// Failed payment history
score += Math.min(signals.failedPayments * 10, 30);
return Math.min(score, 100);
}
async function assessSignupRisk(ip: string, email: string) {
const [vpnRes, emailRes] = await Promise.all([
fetch('https://api.botoi.com/v1/vpn-detect', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ip }),
}),
fetch('https://api.botoi.com/v1/disposable-email/check', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email }),
}),
]);
const vpnData = (await vpnRes.json()).data;
const emailData = (await emailRes.json()).data;
const fraudScore = calculateFraudScore({
vpnDetected: vpnData.is_vpn || vpnData.is_tor,
riskScore: vpnData.risk_score,
disposableEmail: emailData.is_disposable,
accountAge: 0, // new signup
failedPayments: 0,
});
return {
fraudScore,
action: fraudScore > 70 ? 'block' : fraudScore > 40 ? 'review' : 'allow',
details: {
vpn: vpnData.is_vpn,
tor: vpnData.is_tor,
proxy: vpnData.is_proxy,
disposableEmail: emailData.is_disposable,
},
};
}
Kedua panggilan API berjalan secara paralel, sehingga latensi totalnya lebih lambat dari keduanya (biasanya di bawah
100 md). Itu action bidang memberi Anda tiga tingkatan: izinkan, tinjau, atau blokir. Untuk skor
antara 40 dan 70, arahkan pendaftaran ke antrean tinjauan manual daripada menolaknya secara otomatis.
Caching untuk mengurangi panggilan API
Alamat IP tidak mengubah status VPN-nya setiap permintaan. Simpan hasilnya selama 10 menit potong penggunaan API Anda tanpa melewatkan perubahan status.
const vpnCache = new Map<string, { result: VpnResult; expiresAt: number }>();
const CACHE_TTL = 10 * 60 * 1000; // 10 minutes
interface VpnResult {
isVpn: boolean;
isTor: boolean;
isProxy: boolean;
riskScore: number;
}
async function checkVpn(ip: string): Promise<VpnResult> {
const cached = vpnCache.get(ip);
if (cached && cached.expiresAt > Date.now()) {
return cached.result;
}
try {
const res = await fetch('https://api.botoi.com/v1/vpn-detect', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ip }),
signal: AbortSignal.timeout(3000),
});
const { data } = await res.json();
const result: VpnResult = {
isVpn: data.is_vpn,
isTor: data.is_tor,
isProxy: data.is_proxy,
riskScore: data.risk_score,
};
vpnCache.set(ip, { result, expiresAt: Date.now() + CACHE_TTL });
return result;
} catch {
return { isVpn: false, isTor: false, isProxy: false, riskScore: 0 };
}
}
Untuk penerapan multi-server, tukar Peta dalam memori dengan Redis atau Upstash. Kunci cache yang sama (Alamat IP) dan pola TTL berlaku.
Apa yang tidak dapat dideteksi oleh API ini
Kejujuran tentang keterbatasan lebih penting daripada promosi penjualan yang baik. Di sinilah deteksi VPN gagal.
- VPN perumahan. Layanan seperti Relai Pribadi iCloud dan beberapa konfigurasi lalu lintas rute Mullvad melalui alamat IP perumahan. IP ini terlihat identik koneksi internet rumah biasa. Tidak ada deteksi berbasis DNS atau CIDR yang dapat menangkapnya.
-
NAT operator seluler. Operator seluler menggunakan NAT tingkat operator, yang artinya
ribuan pengguna berbagi satu alamat IP. Menandai IP ini akan memengaruhi pengguna yang sah.
API mungkin kembali
is_datacenter: falseDanrisk_score: 0untuk ini IP bahkan ketika pengguna VPN mendukungnya. - Proksi SOCKS5 pribadi. Proksi dihosting di server pribadi dengan perumahan ISP tidak muncul dalam rentang CIDR pusat data dan tidak memiliki nama host yang mencurigakan. Mereka tidak terlihat oleh deteksi otomatis.
- Koneksi khusus IPv6. Titik akhir saat ini hanya mendukung alamat IPv4. Deteksi VPN IPv6 tidak tersedia.
-
Positif palsu pada shared hosting. Pengembang yang menjalankan proyek sampingan di a
Tetesan DigitalOcean akan terpicu
is_datacenter: true. Itu tidak berarti memang begitu menyembunyikan identitas mereka.
Deteksi ini berfungsi dengan baik untuk penyedia VPN komersial (NordVPN, ExpressVPN, Surfshark, CyberGhost) dan lalu lintas Tor. Ini menangkap sebagian besar proxy yang dihosting di pusat data. Itu tidak menangkap VPN perumahan atau proxy pribadi. Harapkan deteksi 80-90% untuk kasus umum dan mendekati nol untuk kasus edge.
Tandai, jangan diblokir
Memblokir pengguna VPN secara langsung merupakan kesalahan bagi sebagian besar aplikasi. Inilah alasannya:
- Pengguna yang sadar privasi tanpa niat menyalahgunakan layanan Anda menjalankan VPN sebagai default.
- Karyawan di VPN perusahaan mengarahkan semua lalu lintas mereka melalui infrastruktur perusahaan.
- Pengguna di negara-negara dengan pembatasan internet mengandalkan VPN untuk mengakses produk Anda.
- Jurnalis, aktivis, dan peneliti keamanan menggunakan Tor untuk alasan yang sah.
Pendekatan yang tepat: tambahkan tanda risiko ke akun, minta verifikasi tambahan (email konfirmasi, nomor telepon, metode pembayaran), atau mengarahkan pendaftaran ke antrean peninjauan. Biarkan manusia membuat keputusan terakhir mengenai kasus-kasus yang ambigu.
Poin-poin penting
-
POST /v1/vpn-detectkembaliis_vpn,is_proxy,is_tor,is_datacenter,provider, Danrisk_scoreuntuk alamat IPv4 apa pun. - Tidak diperlukan kunci API untuk akses anonim (5 permintaan per menit). Kunci gratis membuka 500 permintaan per hari.
- Deteksi mencakup penyedia VPN komersial, node keluar Tor yang dikenal, dan penyedia cloud utama rentang IP. VPN residensial dan proxy pribadi lolos.
- Gabungkan deteksi VPN dengan pemeriksaan email sekali pakai, usia akun, dan riwayat pembayaran skor penipuan yang berarti. Status VPN saja tidak cukup untuk bertindak.
- Tandai koneksi VPN untuk ditinjau. Jangan blokir mereka. Pengguna yang sah menjalankan VPN untuk privasi, kebijakan perusahaan, dan akses di wilayah terlarang.
FAQ
- Bagaimana cara mendeteksi pengguna VPN di aplikasi saya?
- Kirim alamat IP pengguna ke API deteksi VPN (seperti POST /v1/vpn-detect) dan periksa boolean is_vpn dalam responsnya. API juga mengembalikan tanda is_proxy, is_tor, dan is_datacenter sehingga Anda dapat membedakan berbagai metode anonimisasi. Panggil titik akhir ini saat mendaftar, masuk, atau checkout untuk menandai koneksi mencurigakan untuk ditinjau.
- Bisakah API deteksi VPN menangkap setiap koneksi VPN?
- Tidak. Deteksi VPN berfungsi dengan memeriksa rentang IP pusat data yang diketahui, membalikkan nama host DNS, dan daftar simpul keluar Tor. Layanan VPN residensial merutekan lalu lintas melalui alamat ISP rumah, yang terlihat identik dengan lalu lintas residensial biasa. Harapkan 80-90% deteksi VPN komersial (NordVPN, ExpressVPN, Surfshark) tetapi tingkat yang lebih rendah untuk VPN perumahan dan proxy pribadi.
- Haruskah saya memblokir semua pengguna VPN dari aplikasi saya?
- Tidak. Banyak pengguna sah yang menjalankan VPN demi privasi, kebijakan perusahaan, atau karena mereka tinggal di wilayah dengan akses internet terbatas. Memblokir lalu lintas VPN secara langsung akan mengunci pelanggan yang membayar. Sebaliknya, tandai koneksi VPN sebagai risiko yang lebih tinggi dan gabungkan dengan sinyal lain (domain email, metode pembayaran, usia akun) untuk mengambil keputusan.
- Apa perbedaan antara VPN, proxy, dan deteksi Tor?
- VPN mengenkripsi semua lalu lintas melalui terowongan ke server, biasanya dijalankan oleh penyedia komersial. Proksi merutekan lalu lintas melalui server perantara tanpa enkripsi penuh. Tor mengarahkan lalu lintas melalui beberapa relai yang dioperasikan secara sukarela untuk anonimitas maksimum. Botoi API mengembalikan tanda boolean terpisah untuk setiap jenis sehingga Anda dapat menerapkan kebijakan berbeda untuk masing-masing jenis.
- Apakah API deteksi botoi VPN memerlukan kunci API?
- Tidak. Akses anonim memungkinkan 5 permintaan per menit tanpa kunci API. Untuk beban kerja produksi, kunci API gratis menaikkan batas menjadi 500 permintaan per hari. Paket berbayar mulai dari $9/bulan untuk batas tarif yang lebih tinggi.
Mulai membangun dengan botoi
150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.