امنیتWAFضد رباتآموزش

محدودسازی نرخ درخواست و مسدود کردن ربات

محدودسازی نرخ درخواست، قوانین ربات و WAF چطور کنار هم سوءاستفاده، اسکرپینگ و ترافیک خودکار را مهار می‌کنند؟ راهنمای عملی با مثال.

nsin••7 دقیقه مطالعه

ترافیک مخرب همیشه یک حمله عظیم نیست. گاهی فقط یک اسکریپت است که رمزهای مختلف را روی صفحه ورود امتحان می‌کند، یک اسکرپر که کاتالوگ محصولات را می‌خواند یا رباتی که endpoint جست‌وجوی سنگین را پشت‌سرهم صدا می‌زند. nsin برای این کارها سه ابزار اصلی روی لبه دارد: محدودسازی نرخ، قوانین ربات و WAF. در این مطلب می‌بینیم هر کدام چه می‌کند، چطور با هم ترکیب می‌شوند و چطور بدون بلاک کردن کاربر واقعی راه‌اندازی می‌شوند. جزئیات از مستندات محدودسازی نرخ، ربات‌ها و چالش‌ها و WAF گرفته شده است.

محدودسازی نرخ درخواست چیست؟

محدودسازی نرخ (Rate Limiting) تعداد درخواست‌های یک بازدیدکننده را در یک بازه زمانی محدود می‌کند؛ اگر از سقف بگذرد، nsin او را بلاک می‌کند یا چالش می‌دهد. مستندات چهار کاربرد اصلی را نام می‌برند:

  • محافظت از ورود و ثبت‌نام در برابر credential stuffing
  • جلوگیری از scraping کاتالوگ
  • محافظت از endpointهای گران مثل جست‌وجو، خروجی گرفتن و API
  • کاهش فشار ناگهانی ترافیک

ساخت قانون

از Rules → Add Rule → Rate Limit شروع کنید، آدرس محافظت‌شده مثل /login را بدهید، سقف تعداد درخواست و طول بازه (بر حسب ثانیه)، حالت شمارش و اقدام هنگام عبور از سقف را تنظیم کنید و Save را بزنید.

حالت‌های شمارش

  • Per visitor: همه درخواست‌های یک بازدیدکننده (یک آدرس IP) با هم شمرده می‌شود.
  • Per visitor, per address: هر مسیر برای هر بازدیدکننده جداگانه شمرده می‌شود.

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

اقدام هنگام عبور از سقف

  • Block: تا پایان بازه درخواست‌ها را رد می‌کند؛ مناسب سوءاستفاده.
  • Challenge: بازدیدکننده باید ثابت کند انسان است و بعد ادامه می‌دهد؛ مناسب سقف‌هایی که آدم واقعی هم ممکن است به آن‌ها برسد.

علاوه بر این، تنظیم Burst چند درخواست اضافه را برای لحظه‌ای تحمل می‌کند تا صفحه‌ای که چند درخواست هم‌زمان می‌فرستد قفل نشود.

نمونه مستندات: /login، ۵ درخواست در ۶۰ ثانیه، به ازای هر بازدیدکننده، با چالش هنگام عبور. آدم واقعی یک یا دو بار وارد می‌شود، اما اسکریپت حدس رمز فوراً به سقف می‌خورد.

سقف را چطور انتخاب کنیم؟

  • بالاتر از مصرف عادی شروع کنید و بعد از دیدن ترافیک سفت‌ترش کنید.
  • یک بازدید صفحه چندین درخواست است (تصویر، CSS، API)؛ قانون را روی endpoint مشخص بگذارید، نه کل سایت.
  • یک دفتر یا یک شبکه موبایل ممکن است یک آدرس مشترک داشته باشند و سقف سراسری همه آن‌ها را با هم محدود می‌کند. اگر مطمئن نیستید، challenge را انتخاب کنید.

پیش‌تر در مقاله فایروال وب و DDoS توضیح داده‌ایم چرا یک سقف واحد برای کل سایت معمولاً اشتباه است.

ضد دیداس: محدودسازی نرخ چه سهمی دارد؟

مستندات nsin ادعای «ضد دیداس کامل» ندارد و ما هم چنین ادعایی نمی‌کنیم. آنچه به‌صورت مشخص مستند شده چند ابزار لبه است که فشار ترافیک ناخواسته را از روی سرور شما کم می‌کنند:

  • کش لبه، تا درخواست‌ها به سرور نرسند؛ ببینید مکانیزم کش.
  • محدودسازی نرخ روی مسیرهای پرهزینه و برای کم کردن فشار ناگهانی ترافیک.
  • WAF برای درخواست‌های حمله.
  • قوانین بلاک و ربات برای ترافیکی که هرگز نمی‌خواهید.

هیچ‌کدام جای معماری درست و به‌روزرسانی نرم‌افزار را نمی‌گیرند، ولی بار ناخواسته را از سرور شما برمی‌دارند. اگر مبدأ خودتان چند سرور دارد، استخر مبدأ و failover هم کمک می‌کند.

مسدود کردن ربات: قوانین ربات، چالش و اثر انگشت

مستندات سه ابزار برای ترافیک خودکار معرفی می‌کنند:

قوانین ربات

قانون ربات، ربات‌هایی را می‌گیرد که لبه می‌شناسد: موتورهای جستجو، خزنده‌های هوش مصنوعی، ابزارهای سئو یا هر رباتی. اقدام‌ها:

اقدامکار
Blockدرخواست را رد می‌کند.
Serve different contentپاسخ اختصاصی شما را برمی‌گرداند و به سرور نمی‌رسد.
Send to a different serverدرخواست را به مبدأ دیگری پروکسی می‌کند.
Tag onlyعبور می‌دهد و فقط در آنالیتیکس علامت‌گذاری می‌کند.

فقط ربات‌های تأییدشده (Verified only)

هر کسی می‌تواند ادعا کند Googlebot است، چون این فقط یک متن در درخواست است. گزینه Verified only فقط رباتی را شامل می‌شود که با DNS یا IP تأیید شده باشد؛ یعنی قانونی که Googlebot را راه می‌دهد، Googlebot واقعی را شامل می‌شود و مقلدها را نه. درباره مسئله سئو در دسترسی Googlebot بخوانید.

چالش (CAPTCHA)

قانون چالش روی مسیرهای انتخابی یک بررسی تعاملی نشان می‌دهد؛ کسی که از آن بگذرد مرورش ادامه پیدا می‌کند و بار دوم از او سؤال نمی‌شود. چالش زمانی مناسب است که بلاک کردن خیلی خشن باشد؛ مثلاً صفحه ورود هدف credential stuffing شده، endpoint جستجو اسکرپ می‌شود یا فرم ثبت‌نام اسپم می‌گیرد.

قوانین اثر انگشت

بعضی ترافیک User-Agent عادی دارد اما رفتارش شبیه مرورگر نیست. قوانین اثر انگشت درخواست را بر اساس اثر انگشت TLS/HTTP تشخیص می‌دهند و می‌توانند آن را رها (drop)، چالش یا فقط تگ کنند. این ابزار پیشرفته است و مستندات توصیه می‌کنند از حالت tag شروع کنید.

آیا بلاک کردن خزنده‌های AI به رتبه گوگل ضرر می‌زند؟

طبق مستندات خیر؛ خزنده‌های AI و موتورهای جستجو جدا هستند، پس می‌توانید خزنده‌های AI را ببندید و Googlebot را دست نزنید. فقط توجه کنید که بستن یک موتور پاسخ‌گوی هوش مصنوعی از نتایج همان موتور کم می‌کند، ولی بستن خزنده‌های آموزشی ترافیکی از شما نمی‌گیرد. جزئیات بیشتر در کنترل خزنده‌ها.

WAF: حمله‌ها را از نرخ جدا کنید

WAF درخواست‌ها را بررسی می‌کند و حمله‌هایی مثل SQL injection، XSS، path traversal و command injection را می‌بندد. nsin آن را بر پایه OWASP Core Rule Set مدیریت می‌کند و خودتان امضا نمی‌نویسید؛ فقط محل و شدت را تعیین می‌کنید.

تنظیمکار
Strictness (سطح ۱ تا ۴)چه بررسی‌هایی اجرا شود؛ ۱ فقط حمله‌های واضح، بالاتر یعنی حمله‌های ظریف‌تر و false positive بیشتر. برای بیشتر سایت‌ها ۱ تا ۲ مناسب است.
Sensitivityهر بررسی‌ای که فعال شود امتیازی اضافه می‌کند و وقتی جمع امتیاز به این آستانه برسد، درخواست بلاک می‌شود؛ عدد کمتر یعنی سخت‌گیرتر.
Body inspection limitچند KB از بدنه درخواست بررسی شود؛ 0 یعنی بدنه بررسی نشود.

تفاوت مهم: WAF جلوی حمله را می‌گیرد؛ محدودسازی نرخ کنترل می‌کند یک بازدیدکننده چند بار درخواست بفرستد. برای ترافیک غیرحمله مثل یک کشور یا مسیر، قانون بلاک مناسب است. اگر از حالت «فقط این کشورها مجازند» (Allow only these countries) استفاده می‌کنید، اول کشور خودتان را در فهرست بگذارید تا خودتان را قفل نکنید.

ترکیب پیشنهادی مستندات

  1. یک قانون WAF برای کل سایت با strictness برابر ۱.
  2. قانون WAF سخت‌گیرتر روی /admin/* یا API.
  3. محدودسازی نرخ روی /login.
  4. قانون بلاک برای مسیرهایی که هرگز ارائه نمی‌دهید، مثل /wp-login.php در سایتی که وردپرس نیست.

ترتیب قوانین مهم است: قوانین «مجاز» را بالاتر از قوانین «بلاک» بگذارید. جزئیات در مرور قوانین.

قبل از اجرا، dry run

قوانین را ابتدا در حالت dry run بسازید؛ قانونی که در این حالت باشد آنچه را بلاک می‌کرد فقط ثبت می‌کند و همه درخواست‌ها را عبور می‌دهد. یکی دو روز صبر کنید، لاگ WAF را در Monitoring → WAF log ببینید و اگر ترافیک واقعی گرفته می‌شد، قانون را اصلاح کنید و بعد فعالش کنید. توجه کنید که طبق مستندات، قابلیت‌ها به پلن هر دامنه بستگی دارند؛ برای نمونه Monitoring، که لاگ WAF در آن است، یک قابلیت پریمیوم است. پلن‌ها را ببینید.

سه راه رفع false positive، از دقیق‌ترین به کلی‌ترین: مستثنی کردن (exclude) همان شناسه قانون، محدود کردن مسیرها تا WAF از آن endpoint بگذرد و پایین آوردن strictness. مراحل کلی اتصال دامنه به CDN را در راه‌اندازی CDN بدون قطعی توضیح داده‌ایم.

نکته مهم: کاربرانی که بلاک شوند صفحه خود nsin را می‌بینند (403 برای WAF و 429 برای محدودسازی نرخ)؛ این صفحه‌ها با قوانین صفحه خطا قابل جایگزینی نیستند، چون آن قوانین فقط 5xx را پوشش می‌دهند (جزئیات).

پرسش‌های متداول

آیا محدودسازی نرخ کاربر واقعی را بلاک می‌کند؟

با سقف معقول و محدود به یک مسیر، نه. اگر مطمئن نیستید از challenge استفاده کنید. بلاک خودش بعد از پایان بازه برداشته می‌شود.

محدودسازی نرخ بهتر است یا WAF؟

هر دو. WAF حمله را می‌گیرد و محدودسازی نرخ تعداد دفعات را کنترل می‌کند.

گوگل سایتم را ایندکس نمی‌کند، مقصر قانون ربات است؟

ممکن است. قانون را به حالت tag یا dry run ببرید تا ببینید Googlebot را می‌گیرد یا نه.

چالش زیاد به کاربران واقعی نشان داده می‌شود؟

قانون را به مسیرهایی مثل /login و /search محدود کنید، نه کل سایت.

قوانین را از پنل nsin بسازید، اول در dry run آزمایش کنید و بعد فعال کنید.