محدودکننده نرخ شما یک کنترل امنیتی نیست

یک ربات در عرض چند دقیقه تمام داده‌های مربوط به یک گذرنامه را از API من استخراج کرد.

محدودکننده نرخ من جلوی آن را نگرفت.

محدودیت ۳,۰۰۰ فراخوانی در ماه بود. اسکن کامل یک گذرنامه تنها ۱۹۵ فراخوانی نیاز دارد. ربات زیر حد مجاز من باقی ماند و همه‌چیز را دزدید.

محدود کردن نرخ (Rate limiting) از هزینه‌های زیرساختی شما محافظت می‌کند، نه از داده‌هایتان.

اگر این دو ایده را با هم اشتباه بگیرید، داده‌های خود را لو خواهید داد.

محدودکننده‌های نرخ تنها یک سوال می‌پرسند: آیا این کلاینت در حال حاضر هزینه زیادی برای من دارد؟

اسکرپرها (Scrapers) عمداً زیر آن خط باقی می‌مانند. اسکرپر من با سرعت ۲۵ درخواست در دقیقه کار می‌کرد. این بار بسیار ناچیزی است. برای کپی کردن کل مجموعه داده‌های من، تنها به ۴۰,۰۰۰ فراخوانی نیاز است. اگر یک هکر از حساب‌های رایگان زیادی استفاده کند، هیچ سقف حجمی (volume cap) نمی‌تواند او را شناسایی کند.

نگاه کردن به حجم را متوقف کنید. به هویت، پوشش و الگو توجه کنید.

من دو اشتباه کردم. اول اینکه IP منبع را ثبت (log) نکردم. یک هکر می‌توانست به سادگی دوباره با یک حساب رایگان ثبت‌نام کند.

ابتدا لاگ‌های خود را اصلاح کنید. ستون‌های IP و کشور را به پایگاه داده خود اضافه کنید. به جای آدرس ریموت (remote address)، از IP واقعی کلاینت که از Cloudflare می‌آید استفاده کنید. این کار به شما اجازه می‌دهد مهاجمان را در لایه شبکه مسدود کنید.

دوم، محدودیت‌های خود را تغییر دهید.

فقط تعداد درخواست‌ها در ماه را محدود نکنید. محدود کنید که یک گذرنامه در هر روز می‌تواند چند مقصد مختلف را بررسی کند. یک کاربر واقعی چند مقصد را بررسی می‌کند، اما یک اسکرپر سعی می‌کند همه آن‌ها را بررسی کند.

یک عملیات جمع‌آوری انبوه داده (data sweep) امضای خاصی دارد:

  • متراکم است.
  • متوالی است.
  • تمام موارد مربوط به یک منبع را پوشش می‌دهد.

شما می‌توانید این الگو را با نگاه کردن به یک پنجره لغزان (sliding window) از فعالیت‌ها شناسایی کنید. اگر یک گذرنامه در مدت زمان کوتاهی به مقصدهای بسیار زیادی درخواست فرستاد، آن را علامت‌گذاری (flag) کنید. سرعت آن کلید (key) را کاهش دهید (throttle) یا بلافاصله آن را مسدود کنید.

حالا شما به جای صرفاً شمردن اعداد، به رفتار واکنش نشان می‌دهید.

استراتژی خود را به دو وظیفه تقسیم کنید:

  1. محدودکننده نرخ: از پول خود محافظت کنید. از سقف‌های حجمی برای هر کلید استفاده کنید.
  2. دفاع در برابر استخراج: از داده‌های خود محافظت کنید. از هویت، پوشش و ریتم (cadence) استفاده کنید.

اگر فقط یک محدودکننده نرخ دارید، شما فقط یک حفاظ برای صورت‌حساب دارید، نه امنیت.

Source: https://dev.to/mathis_higuinen_6db9b244c/your-rate-limiter-is-not-a-security-control-4b3f