VPN- und Proxy-Erkennungs-API: Missbrauch melden, ohne Benutzer zu blockieren
Erkennen Sie VPN-, Proxy-, Tor- und Rechenzentrumsverbindungen mit einer POST-Anfrage. Enthält Next.js-Middleware, Express-Ratenbegrenzung und Beispiele für Betrugsbewertung.
Ihre SaaS-App bietet eine kostenlose Testversion pro Benutzer. Benutzer melden sich an, aktivieren ein VPN und melden sich erneut an. Werbemissbrauch kostet Sie Umsatz und verzerrt Ihre Conversion-Kennzahlen. Sie müssen VPN und Proxy markieren Verbindungen zum Zeitpunkt der Anmeldung.
Dieser Leitfaden behandelt die Botoi POST /v1/vpn-detect Endpunkt: Was es zurückgibt, wie
Integrieren Sie es in Next.js- und Express-Apps, wie Sie es mit anderen Betrugssignalen kombinieren und wo
es greift zu kurz.
Der Endpunkt
Eine POST-Anfrage mit einer IP-Adresse im Text. Keine speziellen Header, kein API-Schlüssel erforderlich anonymer Zugriff.
curl -X POST https://api.botoi.com/v1/vpn-detect \\
-H "Content-Type: application/json" \\
-d '{ "ip": "185.220.101.1" }'
Antwort für einen bekannten Tor-Exit-Knoten:
{
"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
}
}
}
Antwort für eine saubere Privat-IP:
{
"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
}
}
}
Antwortfelder
- is_vpn (boolean): True, wenn die IP zu einem bekannten Rechenzentrumsbereich gehört oder einen verdächtigen Reverse-DNS-Hostnamen hat, der VPN-bezogene Schlüsselwörter enthält.
- is_proxy (boolean): True, wenn der umgekehrte DNS-Hostname einen Proxyserver vorschlägt.
- is_tor (boolean): True, wenn die IP mit einem bekannten Tor-Exit-Knoten übereinstimmt.
- is_datacenter (boolean): True, wenn die IP in die CIDR-Bereiche von AWS, Google Cloud, Azure, DigitalOcean oder Linode fällt.
- Anbieterin (Zeichenfolge oder Null): Der Name des Cloud-Anbieters, wann
is_datacenterist wahr. Null für Privat- und Tor-IPs. - risk_score (Zahl, 0–100): Tor-Verbindungen erhalten einen Wert von 90, Rechenzentrums-IPs erhalten einen Wert von 60, verdächtige Hostnamen erhalten einen Wert von 40. Saubere private IPs erhalten einen Wert von 0.
- Schecks (Objekt): Aufschlüsselung der ausgelösten Erkennungsmethoden zum Debuggen.
Markieren Sie VPN-Benutzer bei der Anmeldung mit der Next.js-Middleware
Diese Middleware fängt POST-Anfragen an Ihre Anmelderoute ab und vergleicht die IP des Anrufers mit der VPN-Erkennungs-API und fügt der Anfrage einen Header hinzu, wenn ein VPN erkannt wird. Ihr Anmeldebearbeiter liest den Header und entscheidet, was zu tun ist: E-Mail-Bestätigung anfordern, eine Markierung für die manuelle Überprüfung hinzufügen oder die Probezeit verkürzen.
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'],
};
Die Middleware blockiert die Anmeldung nicht. Es gibt ein Signal an Ihren Handler weiter. Das ist das Richtige Ansatz, da der VPN-Verkehr kein Beweis für Betrug ist. Ein Benutzer in einem Unternehmens-VPN oder auf Reisen über ein restriktives Netzwerk ist ein legitimer Kunde.
Strengere Ratenbeschränkungen für VPN-IPs in Express
Wenn Sie eine API ausführen, können Sie ohne Blockierung strengere Ratenbeschränkungen auf VPN- und Proxy-Verbindungen anwenden sie direkt. Diese Middleware stellt Standardbenutzern 100 Anfragen pro Stunde und VPN-Benutzern 20 zur Verfügung.
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();
}
Das Verhältnis von 5:1 zwischen Standard- und VPN-Limits ist ein Ausgangspunkt. Passen Sie es basierend auf Ihrem Missbrauch an Muster. Wenn Ihre API Zahlungen oder Kontoänderungen abwickelt, sind strengere VPN-Limits sinnvoll. Für schreibgeschützte Endpunkte benötigen Sie möglicherweise überhaupt keine differenziellen Grenzwerte.
Betrugsbewertung: Kombinieren Sie die VPN-Erkennung mit anderen Signalen
Die VPN-Erkennung allein ist ein schwaches Betrugssignal. Ein VPN + Einweg-E-Mail + neues Konto + fehlgeschlagen Zahlungsversuche sind ein starkes Signal. Diese Funktion kombiniert mehrere Eingaben zu einem einzigen Betrug punkten.
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,
},
};
}
Beide API-Aufrufe werden parallel ausgeführt, daher ist die Gesamtlatenz die langsamere von beiden (normalerweise unter).
100ms). Der action Das Feld bietet Ihnen drei Ebenen: Zulassen, Überprüfen oder Blockieren. Für Partituren
Wenn Sie zwischen 40 und 70 liegen, leiten Sie die Anmeldung an eine manuelle Überprüfungswarteschlange weiter, anstatt sie automatisch abzulehnen.
Caching zur Reduzierung von API-Aufrufen
Eine IP-Adresse ändert ihren VPN-Status nicht bei jeder Anfrage. Zwischenspeichern Sie das Ergebnis für 10 Minuten Reduzieren Sie Ihre API-Nutzung, ohne Statusänderungen zu verpassen.
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 };
}
}
Tauschen Sie bei Bereitstellungen mit mehreren Servern die In-Memory-Map gegen Redis oder Upstash aus. Der gleiche Cache-Schlüssel (IP-Adresse) und TTL-Muster gelten.
Was diese API nicht erkennen kann
Ehrlichkeit in Bezug auf Einschränkungen ist wichtiger als ein ausgefeiltes Verkaufsgespräch. Hier finden Sie die VPN-Erkennung fällt zu kurz.
- Privat-VPNs. Dienste wie iCloud Private Relay und einige Konfigurationen von Mullvad leiten den Datenverkehr über private IP-Adressen weiter. Diese IPs sehen identisch aus regelmäßige Internetverbindungen zu Hause. Keine Reverse-DNS- oder CIDR-basierte Erkennung erkennt sie.
-
Mobilfunkanbieter-NAT. Mobilfunkanbieter verwenden NAT auf Carrier-Niveau
Tausende von Benutzern teilen sich eine einzige IP-Adresse. Die Kennzeichnung dieser IPs wirkt sich auf legitime Benutzer aus.
Die API kehrt möglicherweise zurück
is_datacenter: falseUndrisk_score: 0für diese IPs, auch wenn sich dahinter ein VPN-Benutzer befindet. - Private SOCKS5-Proxys. Proxys, die auf persönlichen Servern mit Wohnsitz gehostet werden ISPs erscheinen nicht in den CIDR-Bereichen von Rechenzentren und haben keine verdächtigen Hostnamen. Das sind sie unsichtbar für die automatische Erkennung.
- Nur IPv6-Verbindungen. Der aktuelle Endpunkt unterstützt nur IPv4-Adressen. Die IPv6-VPN-Erkennung ist nicht verfügbar.
-
Fehlalarme bei Shared Hosting. Ein Entwickler, der ein Nebenprojekt auf a ausführt
DigitalOcean-Tröpfchen wird ausgelöst
is_datacenter: true. Das bedeutet nicht, dass sie es sind ihre Identität verbergen.
Die Erkennung funktioniert gut für kommerzielle VPN-Anbieter (NordVPN, ExpressVPN, Surfshark, CyberGhost) und Tor-Verkehr. Es fängt die meisten im Rechenzentrum gehosteten Proxys ab. Es fängt keine privaten VPNs ab oder private Proxys. Erwarten Sie eine Erkennung von 80–90 % für die häufigsten Fälle und nahezu Null für Randfälle.
Markieren, nicht blockieren
Für die meisten Anwendungen ist das vollständige Blockieren von VPN-Benutzern ein Fehler. Hier ist der Grund:
- Datenschutzbewusste Benutzer, die nicht die Absicht haben, Ihren Dienst zu missbrauchen, nutzen standardmäßig VPNs.
- Mitarbeiter in Unternehmens-VPNs leiten ihren gesamten Datenverkehr über die Unternehmensinfrastruktur.
- Benutzer in Ländern mit Internetbeschränkungen sind auf VPNs angewiesen, um überhaupt auf Ihr Produkt zugreifen zu können.
- Journalisten, Aktivisten und Sicherheitsforscher nutzen Tor aus legitimen Gründen.
Der richtige Ansatz: Fügen Sie dem Konto eine Risikomarkierung hinzu und verlangen Sie eine zusätzliche Verifizierung (E-Mail). B. Bestätigung, Telefonnummer, Zahlungsmethode) oder leiten Sie die Anmeldung an eine Überprüfungswarteschlange weiter. Lass die Menschen Treffen Sie bei unklaren Fällen die letzte Entscheidung.
Wichtige Punkte
-
POST /v1/vpn-detectkehrt zurückis_vpn,is_proxy,is_tor,is_datacenter,provider, Undrisk_scorefür jede IPv4-Adresse. - Für den anonymen Zugriff ist kein API-Schlüssel erforderlich (5 Anfragen pro Minute). Kostenlose Schlüssel entsperren 500 Anfragen pro Tag.
- Die Erkennung umfasst kommerzielle VPN-Anbieter, bekannte Tor-Exit-Knoten und große Cloud-Anbieter IP-Bereiche. Privat-VPNs und private Proxys schlüpfen durch.
- Kombinieren Sie die VPN-Erkennung mit einmaligen E-Mail-Prüfungen, Kontoalter und Zahlungsverlauf ein aussagekräftiger Betrugswert. Der VPN-Status allein reicht nicht aus, um darauf zu reagieren.
- Markieren Sie VPN-Verbindungen zur Überprüfung. Blockiere sie nicht. Legitime Benutzer betreiben VPNs aus Datenschutzgründen. Unternehmensrichtlinien und Zugang in eingeschränkten Regionen.
FAQ
- Wie erkenne ich VPN-Benutzer in meiner App?
- Senden Sie die IP-Adresse des Benutzers an eine VPN-Erkennungs-API (wie POST /v1/vpn-detect) und überprüfen Sie den booleschen Wert is_vpn in der Antwort. Die API gibt außerdem die Flags is_proxy, is_tor und is_datacenter zurück, sodass Sie zwischen verschiedenen Anonymisierungsmethoden unterscheiden können. Rufen Sie diesen Endpunkt während der Registrierung, Anmeldung oder beim Auschecken auf, um verdächtige Verbindungen zur Überprüfung zu kennzeichnen.
- Kann eine VPN-Erkennungs-API jede VPN-Verbindung abfangen?
- Nein. Die VPN-Erkennung funktioniert durch die Überprüfung bekannter IP-Bereiche von Rechenzentren, Reverse-DNS-Hostnamen und Tor-Exit-Knotenlisten. Privat-VPN-Dienste leiten den Datenverkehr über private ISP-Adressen weiter, die mit dem regulären Privatdatenverkehr identisch aussehen. Erwarten Sie eine Erkennung von 80–90 % bei kommerziellen VPNs (NordVPN, ExpressVPN, Surfshark), aber niedrigere Raten für private VPNs und private Proxys.
- Soll ich alle VPN-Benutzer von meiner Anwendung blockieren?
- Nein. Viele legitime Benutzer betreiben VPNs aus Datenschutzgründen, aufgrund von Unternehmensrichtlinien oder weil sie in Regionen mit eingeschränktem Internetzugang leben. Durch die vollständige Blockierung des VPN-Verkehrs werden zahlende Kunden ausgesperrt. Markieren Sie stattdessen VPN-Verbindungen als risikoreicher und kombinieren Sie sie mit anderen Signalen (E-Mail-Domäne, Zahlungsmethode, Kontoalter), um eine Entscheidung zu treffen.
- Was ist der Unterschied zwischen VPN-, Proxy- und Tor-Erkennung?
- Ein VPN verschlüsselt den gesamten Datenverkehr durch einen Tunnel zu einem Server, der normalerweise von einem kommerziellen Anbieter betrieben wird. Ein Proxy leitet den Datenverkehr ohne vollständige Verschlüsselung über einen Zwischenserver weiter. Für maximale Anonymität leitet Tor den Datenverkehr über mehrere von Freiwilligen betriebene Relays weiter. Die Botoi-API gibt für jeden Typ separate boolesche Flags zurück, sodass Sie auf jeden Typ unterschiedliche Richtlinien anwenden können.
- Benötigt die Botoi-VPN-Erkennungs-API einen API-Schlüssel?
- Nein. Der anonyme Zugriff ermöglicht 5 Anfragen pro Minute ohne API-Schlüssel. Für Produktions-Workloads erhöht ein kostenloser API-Schlüssel die Grenze auf 500 Anfragen pro Tag. Bezahlte Pläne beginnen bei 9 $/Monat für höhere Tariflimits.
Starte mit botoi zu entwickeln
150+ API-Endpunkte für Abfragen, Textverarbeitung, Bildgenerierung und Entwickler-Tools. Kostenloser Tarif, keine Kreditkarte nötig.