تخطي إلى المحتوى
Guide

واجهة برمجة تطبيقات VPN والكشف عن الوكيل: قم بالإبلاغ عن إساءة الاستخدام دون حظر المستخدمين

| 7 min read

اكتشف اتصالات VPN والوكيل وTor ومركز البيانات بطلب POST واحد. يتضمن البرنامج الوسيط Next.js وتحديد المعدل السريع وأمثلة على نقاط الاحتيال.

Digital shield icon with network connections
Photo by Privecstasy on Unsplash

يقدم تطبيق SaaS الخاص بك نسخة تجريبية مجانية لكل مستخدم. يقوم المستخدمون بالتسجيل وتنشيط VPN والتسجيل مرة أخرى. إن إساءة استخدام العروض الترويجية تكلفك إيرادات وتؤدي إلى تحريف مقاييس التحويل لديك. تحتاج إلى وضع علامة على VPN والوكيل الاتصالات عند نقطة التسجيل.

يغطي هذا الدليل botoi POST /v1/vpn-detect نقطة النهاية: ما الذي تُرجعه، وكيف دمجها في تطبيقات Next.js وExpress، وكيفية دمجها مع إشارات الاحتيال الأخرى، وأين إنه يقصر.

نقطة النهاية

طلب POST واحد بعنوان IP في النص الأساسي. لا توجد رؤوس خاصة، ولا يلزم وجود مفتاح API لها وصول مجهول.

curl -X POST https://api.botoi.com/v1/vpn-detect \\
  -H "Content-Type: application/json" \\
  -d '{ "ip": "185.220.101.1" }'

الاستجابة لعقدة خروج Tor المعروفة:

{
  "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
    }
  }
}

الاستجابة لعنوان 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
    }
  }
}

حقول الاستجابة

  • is_vpn (منطقي): صحيح إذا كان عنوان IP ينتمي إلى نطاق مركز بيانات معروف أو يحتوي على اسم مضيف DNS عكسي مريب يحتوي على كلمات رئيسية مرتبطة بشبكة VPN.
  • is_proxy (منطقي): صحيح إذا كان اسم مضيف DNS العكسي يشير إلى خادم وكيل.
  • is_tor (منطقي): صحيح إذا كان عنوان IP يطابق عقدة خروج Tor المعروفة.
  • is_datacenter (منطقي): صحيح إذا كان عنوان IP يقع ضمن نطاقات AWS أو Google Cloud أو Azure أو DigitalOcean أو Linode CIDR.
  • مزود (سلسلة أو خالية): اسم موفر السحابة متى is_datacenter هذا صحيح. خالية لعناوين IP السكنية وTor.
  • Risk_Score (الرقم، 0-100): تحصل اتصالات Tor على 90، وعناوين IP لمراكز البيانات 60، وأسماء المضيفين المشبوهة 40. وتسجل عناوين IP السكنية النظيفة 0.
  • الشيكات (الكائن): تفصيل طرق الكشف التي تم تشغيلها لتصحيح الأخطاء.

ضع علامة على مستخدمي VPN عند التسجيل باستخدام البرنامج الوسيط Next.js

تعترض هذه البرامج الوسيطة طلبات POST لمسار التسجيل الخاص بك، وتتحقق من عنوان IP الخاص بالمتصل مقابل واجهة برمجة تطبيقات اكتشاف VPN، وإرفاق رأس بالطلب عند اكتشاف VPN. معالج التسجيل الخاص بك يقرأ الرأس ويقرر ما يجب فعله: طلب التحقق من البريد الإلكتروني، أو إضافة علامة مراجعة يدوية، أو تقليل الفترة التجريبية.

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'],
};

لا تمنع البرامج الوسيطة عملية التسجيل. يقوم بتمرير إشارة إلى المعالج الخاص بك. هذا هو الحق هذا النهج لأن حركة مرور VPN ليست دليلاً على الاحتيال. مستخدم على VPN خاص بالشركة أو مسافر من خلال شبكة مقيدة هو عميل شرعي.

حدود أسعار أكثر صرامة لعناوين VPN IP في Express

إذا قمت بتشغيل واجهة برمجة التطبيقات (API)، فيمكنك تطبيق حدود أسعار أكثر صرامة على اتصالات VPN والوكيل دون حظر لهم صريحا. تمنح هذه البرامج الوسيطة المستخدمين القياسيين 100 طلب في الساعة ومستخدمي 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();
}

تعتبر نسبة 5:1 بين الحدود القياسية وحدود VPN نقطة البداية. قم بضبطه بناءً على إساءة استخدامك أنماط. إذا كانت واجهة برمجة التطبيقات (API) الخاصة بك تتعامل مع المدفوعات أو تعديلات الحساب، فإن حدود VPN الأكثر صرامة تكون منطقية. بالنسبة لنقاط النهاية للقراءة فقط، قد لا تحتاج إلى حدود تفاضلية على الإطلاق.

تسجيل الاحتيال: الجمع بين اكتشاف VPN والإشارات الأخرى

يعد اكتشاف VPN وحده بمثابة إشارة احتيال ضعيفة. VPN + بريد إلكتروني يمكن التخلص منه + حساب جديد + فشل محاولات الدفع هي إشارة قوية. تجمع هذه الوظيفة بين مدخلات متعددة في عملية احتيال واحدة يسجل.

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,
    },
  };
}

يتم تشغيل كلا استدعاءات واجهة برمجة التطبيقات (API) بالتوازي، وبالتالي فإن زمن الوصول الإجمالي هو الأبطأ بين الاثنين (عادةً ما يكون أقل من 100 مللي ثانية). ال action يمنحك الحقل ثلاثة مستويات: السماح أو المراجعة أو الحظر. للعشرات بين 40 و70، قم بتوجيه الاشتراك إلى قائمة انتظار المراجعة اليدوية بدلاً من رفضه تلقائيًا.

التخزين المؤقت لتقليل مكالمات API

لا يغير عنوان IP حالة VPN الخاصة به في كل طلب. قم بتخزين النتيجة لمدة 10 دقائق قطع استخدام API الخاص بك دون فقدان تغييرات الحالة.

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 };
  }
}

بالنسبة لعمليات النشر متعددة الخوادم، استبدل الخريطة الموجودة في الذاكرة بـ Redis أو Upstash. نفس مفتاح ذاكرة التخزين المؤقت (عنوان IP) ويتم تطبيق نمط TTL.

ما لا تستطيع واجهة برمجة التطبيقات هذه اكتشافه

الصدق بشأن القيود يهم أكثر من مجرد عرض مبيعات مصقول. هنا يتم الكشف عن VPN يقصر.

  • شبكات VPN السكنية. خدمات مثل iCloud Private Relay وبعض التكوينات من حركة مرور مسار Mullvad من خلال عناوين IP السكنية. تبدو عناوين IP هذه متطابقة اتصالات الإنترنت المنزلية العادية. لا يوجد كشف عكسي يعتمد على DNS أو CIDR يلتقطهم.
  • الناقل المحمول NAT. تستخدم شركات الاتصالات المتنقلة NAT من فئة الناقل، مما يعني يتشارك آلاف المستخدمين في عنوان IP واحد. يؤثر وضع علامة على عناوين IP هذه على المستخدمين الشرعيين. قد تعود واجهة برمجة التطبيقات is_datacenter: false و risk_score: 0 لهؤلاء عناوين IP حتى عندما يكون مستخدم VPN خلفها.
  • وكلاء SOCKS5 الخاصة. الوكلاء المستضافون على خوادم شخصية مع سكني لا يظهر مزودو خدمات الإنترنت في نطاقات CIDR لمراكز البيانات وليس لديهم أسماء مضيفين مشبوهة. إنهم كذلك غير مرئية للكشف الآلي.
  • اتصالات IPv6 فقط. تدعم نقطة النهاية الحالية عناوين IPv4 فقط. اكتشاف IPv6 VPN غير متاح.
  • إيجابيات كاذبة على الاستضافة المشتركة. مطور يدير مشروعًا جانبيًا على سيتم تشغيل قطرة DigitalOcean is_datacenter: true. هذا لا يعني أنهم كذلك إخفاء هويتهم.

يعمل الاكتشاف بشكل جيد مع موفري VPN التجاريين (NordVPN، ExpressVPN، Surfshark، CyberGhost) وحركة مرور تور. إنه يلتقط معظم الوكلاء المستضافين في مراكز البيانات. لا يلتقط شبكات VPN السكنية أو وكلاء خاصين. توقع اكتشاف 80-90% للحالات الشائعة وقرب الصفر للحالات الطرفية.

علم، لا تمنع

يعد حظر مستخدمي VPN تمامًا خطأً بالنسبة لمعظم التطبيقات. إليكم السبب:

  • يقوم المستخدمون المهتمون بالخصوصية وليس لديهم أي نية لإساءة استخدام خدمتك بتشغيل شبكات VPN كإعداد افتراضي.
  • يقوم الموظفون على شبكات VPN الخاصة بالشركات بتوجيه كل حركة المرور الخاصة بهم عبر البنية التحتية للشركة.
  • يعتمد المستخدمون في البلدان التي تفرض قيودًا على الإنترنت على شبكات VPN للوصول إلى منتجك على الإطلاق.
  • يستخدم الصحفيون والناشطون والباحثون الأمنيون Tor لأسباب مشروعة.

النهج الصحيح: إضافة علامة خطر إلى الحساب، وطلب التحقق الإضافي (email التأكيد، رقم الهاتف، طريقة الدفع)، أو توجيه الاشتراك إلى قائمة انتظار المراجعة. دع البشر اتخاذ القرار النهائي في الحالات الغامضة.

النقاط الرئيسية

  • POST /v1/vpn-detect يعود is_vpn, is_proxy, is_tor, is_datacenter, provider، و risk_score لأي عنوان IPv4.
  • لا يوجد مفتاح API مطلوب للوصول المجهول (5 طلبات في الدقيقة). مفاتيح مجانية لفتح 500 طلبات يوميا.
  • يغطي الاكتشاف موفري VPN التجاريين وعقد خروج Tor المعروفة وموفري السحابة الرئيسيين نطاقات IP. تتسلل شبكات VPN السكنية والوكلاء الخاصون.
  • اجمع بين اكتشاف VPN وشيكات البريد الإلكتروني التي يمكن التخلص منها وعمر الحساب وسجل الدفع لـ درجة احتيال ذات مغزى. حالة VPN وحدها ليست كافية للعمل بناءً عليها.
  • ضع علامة على اتصالات VPN للمراجعة. لا تمنعهم. يقوم المستخدمون الشرعيون بتشغيل شبكات VPN للخصوصية، سياسة الشركة والوصول إليها في المناطق المحظورة.

FAQ

كيف يمكنني اكتشاف مستخدمي VPN في تطبيقي؟
أرسل عنوان IP الخاص بالمستخدم إلى واجهة برمجة تطبيقات اكتشاف VPN (مثل POST /v1/vpn-detect) وتحقق من القيمة المنطقية is_vpn في الاستجابة. تقوم واجهة برمجة التطبيقات أيضًا بإرجاع علامات is_proxy وis_tor وis_datacenter حتى تتمكن من التمييز بين طرق إخفاء الهوية المختلفة. اتصل بنقطة النهاية هذه أثناء التسجيل أو تسجيل الدخول أو الخروج لوضع علامة على الاتصالات المشبوهة للمراجعة.
هل يمكن لواجهة برمجة تطبيقات اكتشاف VPN التقاط كل اتصال VPN؟
لا، يعمل اكتشاف VPN عن طريق التحقق من نطاقات IP المعروفة لمراكز البيانات، وأسماء مضيفي DNS العكسية، وقوائم عقد خروج Tor. تقوم خدمات VPN السكنية بتوجيه حركة المرور عبر عناوين مزود خدمة الإنترنت المنزلية، والتي تبدو مماثلة لحركة المرور السكنية العادية. توقع اكتشاف 80-90% من شبكات VPN التجارية (NordVPN، ExpressVPN، Surfshark) ولكن بأسعار أقل لشبكات VPN السكنية والوكلاء الخاصين.
هل يجب أن أحظر جميع مستخدمي VPN من تطبيقي؟
لا. يقوم العديد من المستخدمين الشرعيين بتشغيل شبكات VPN لأغراض الخصوصية أو سياسة الشركة أو لأنهم يعيشون في مناطق ذات وصول مقيد إلى الإنترنت. سيؤدي حظر حركة مرور VPN بشكل كامل إلى حظر العملاء الذين يدفعون. بدلاً من ذلك، ضع علامة على اتصالات VPN باعتبارها ذات خطورة أعلى وادمجها مع إشارات أخرى (نطاق البريد الإلكتروني، وطريقة الدفع، وعمر الحساب) لاتخاذ القرار.
ما الفرق بين اكتشاف VPN والوكيل وTor؟
تقوم شبكة VPN بتشفير كل حركة المرور عبر نفق إلى خادم، عادةً ما يتم تشغيله بواسطة مزود تجاري. يقوم الوكيل بتوجيه حركة المرور عبر خادم وسيط دون تشفير كامل. يقوم Tor بتوجيه حركة المرور من خلال مرحلات متعددة يديرها متطوعون لتحقيق أقصى قدر من عدم الكشف عن هويته. تقوم واجهة برمجة تطبيقات botoi بإرجاع إشارات منطقية منفصلة لكل نوع حتى تتمكن من تطبيق سياسات مختلفة على كل نوع.
هل تتطلب واجهة برمجة تطبيقات الكشف عن botoi VPN مفتاح واجهة برمجة التطبيقات؟
لا. يسمح الوصول المجهول بخمسة طلبات في الدقيقة بدون مفتاح API. بالنسبة لأحمال عمل الإنتاج، يؤدي مفتاح واجهة برمجة التطبيقات المجاني إلى رفع الحد الأقصى إلى 500 طلب يوميًا. تبدأ الخطط المدفوعة بسعر 9 دولارات شهريًا لحدود الأسعار الأعلى.

ابدأ البناء مع botoi

أكثر من 150 نقطة نهاية API للبحث ومعالجة النصوص وتوليد الصور وأدوات المطورين. باقة مجانية، بدون بطاقة ائتمان.