مقابله با رباتها بدون قطع API
چرا چالش ضدربات API و درگاه پرداخت را قطع میکند و چطور فقط سایت اصلی را چالش کنید، خودکار یا دستی.
چرا چالش ضدربات API و درگاه پرداخت را قطع میکند و چطور فقط سایت اصلی را چالش کنید، خودکار یا دستی.
چالش ضدربات CDN (چالش کوکی، چالش جاوااسکریپت، کپچا) فقط برای مرورگر ساخته شده است: مرورگر چالش را حل میکند و کاربر چیزی نمیبیند. ولی خیلی از درخواستهای یک سایت از مرورگر نمیآیند، یا از مرورگری میآیند که فرصت حل چالش را ندارد:
api.example.comاگر چالش به اینها برسد، به جای جواب درست یک صفحهی چالش میگیرند و قطع میشوند. کاربر واقعی هم اثرش را میبیند: دکمهها کار نمیکنند، ورود انجام نمیشود یا پرداخت ناتمام میماند.
چالش را فقط جایی بگذارید که آدم با مرورگر صفحه باز میکند:
api، app، admin و هر زیردامنهای که بعداً اضافه شود) آزاد بمانند./api/ یا /wp-json/) آزاد بمانند.از محافظت ← قوانین ← مقابله با رباتها روشنش کنید. wardex به جای تنظیم سراسری، یک قانون محدود به میزبان میسازد:
| کلادفلر | ابر آروان | |
|---|---|---|
| چه چیزی ساخته میشود | قانون سفارشی (Custom rule) | قانون فایروال |
| روی چه چیزی چالش میگذارد | فقط صفحههای دامنهی اصلی و www | فقط دامنهی اصلی و www |
| زیردامنهها | همه آزاد، حتی آنهایی که بعداً اضافه شوند | همه آزاد، حتی آنهایی که بعداً اضافه شوند |
| API روی دامنهی اصلی | مسیرهای /api/ و /wp-json/ و هر درخواست غیر از باز کردن صفحه آزاد | مسیرهای /api و /wp-json آزاد |
| رباتهای موتور جستوجو | آزاد | آزاد |
| حالت آزمایشی | ندارد (چالش مدیریتشده) | چالش نامرئی کوکی؛ در اجرای کامل چالش جاوااسکریپت |
پیش از روشن شدن قانون، wardex زیردامنههایی را که پشت CDN هستند از DNS میخواند و نشان میدهد کدام چالش میبینند و کدام آزاد میمانند. تا تأیید نکنید، قانون روشن نمیشود.
قانون قدیمی روی آروان؟ نسخههای قبلی wardex روی آروان حالت محافظت DDoS کل دامنه را عوض میکردند. اگر چنین قانونی دارید، در صفحهی قوانین هشدار قرمز میبینید. آن را بردارید (حالت DDoS به حالت قبل برمیگردد) و دوباره روشن کنید تا به شکل جدید و محدود ساخته شود.
API روی خود دامنهی اصلی دارید؟ اگر مسیر بازگشت درگاه پرداخت یا وبهوکی روی دامنهی اصلی دارید که با /api شروع نمیشود (مثلاً /payment/callback)، بعد از روشن کردن قانون، آن را طبق روش دستی پایین به استثناهای همان قانون اضافه کنید.
wardex همین قانون را خودکار میسازد. اگر میخواهید دستی بسازید یا قانون wardex را برای مسیرهای خودتان تغییر دهید، روش الف را دنبال کنید؛ زیردامنههایی که بعداً اضافه میکنید خودبهخود آزاد میمانند.
روش الف: قانون فایروال فقط برای دامنهی اصلی (پیشنهادی)
فایروال دامنه را باز کنید
در پنل ابر آروان دامنه را انتخاب کنید و به بخش فایروال بروید. حالت محافظت DDoS را خاموش بگذارید.
قانون تازه با عبارت آماده
یک قانون تازه بسازید و در بخش عبارت (Expression) این را بگذارید؛ example.com را با دامنهی خودتان عوض کنید:
http.host in {"example.com" "www.example.com"}
and not (http.request.uri.path starts with "/api")
and not (http.request.uri.path starts with "/wp-json")
and not (http.user_agent contains "Googlebot")
and not (http.user_agent contains "bingbot")
برای هر مسیر دیگری که باید آزاد بماند (مثلاً بازگشت درگاه پرداخت)، یک خط and not (http.request.uri.path starts with "/payment") اضافه کنید.
عمل قانون
عمل را چالش بگذارید. از کوکی شروع کنید (کاربر چیزی نمیبیند). اگر کافی نبود، جاوااسکریپت.
روش ب: حالت محافظت DDoS با استثنای زیردامنهها
استثناها را اول بسازید
در بخش جلوگیری از حملات DDoS، در قوانین خاص، برای هر زیردامنه یک قانون بسازید که آدرسش را به شکل Glob بگیرد، مثلاً api.example.com/*، برای همهی IPها، و چالش را برایش غیرفعال کند. همین کار را برای مسیرهای API و پرداخت روی دامنهی اصلی هم بکنید، مثلاً example.com/api/*.
بعد حالت محافظت را روشن کنید
فقط وقتی همهی استثناها ساخته شدند، حالت محافظت را روی کوکی بگذارید.
زیردامنهی تازه = استثنای تازه
در این روش، هر زیردامنهای که بعداً پشت CDN اضافه میکنید چالش میبیند تا برایش استثنا بسازید. این را در فهرست کارهای افزودن زیردامنه بگذارید.
نام دقیق گزینهها در پنل آروان ممکن است با نسخهی پنل فرق کند؛ راهنمای بهروز را در مستندات ابر آروان ببینید.
wardex همین کار را خودکار انجام میدهد. اگر میخواهید دستی بسازید:
Bot Fight Mode را خاموش بگذارید
در Security → Bots، Bot Fight Mode را خاموش کنید. این گزینه روی کل دامنه اعمال میشود و در پلن رایگان نمیشود برایش استثنا گذاشت.
قانون سفارشی بسازید
به Security → WAF → Custom rules بروید، Create rule را بزنید و Edit expression را باز کنید.
عبارت قانون
این عبارت را بگذارید و example.com را با دامنهی خودتان عوض کنید:
(http.host in {"example.com" "www.example.com"})
and (http.request.method eq "GET")
and (any(http.request.headers["accept"][*] contains "text/html"))
and (not starts_with(http.request.uri.path, "/api/"))
and (not starts_with(http.request.uri.path, "/wp-json/"))
and (not cf.client.bot)
اگر مسیر بازگشت درگاه پرداخت یا وبهوکی روی دامنهی اصلی دارید، آن را هم با and (not starts_with(http.request.uri.path, "/مسیر/")) اضافه کنید.
عمل قانون
Action را روی Managed Challenge بگذارید و با Deploy ذخیره کنید.
API را مستقیم صدا بزنید
از یک ترمینال، یکی از آدرسهای API را بدون مرورگر صدا بزنید:
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
باید همان کدی را بگیرید که قبل از روشن کردن قانون میگرفتید (مثلاً 200 یا 401). اگر 403، 503 یا ریدایرکت 307 گرفتید و جواب HTML بود، چالش به API رسیده است.
سایت را در مرورگر امتحان کنید
سایت را باز کنید، وارد شوید و یک کار کامل انجام دهید. در تب Network ابزار توسعهی مرورگر، درخواستهای API نباید جواب HTML یا کد 403 بگیرند.
پرداخت و اپ موبایل
اگر درگاه پرداخت یا اپ موبایل دارید، یک تراکنش آزمایشی و یک ورود از اپ انجام دهید.