فيضان من أدوات الاستخراج على خطة Cloudflare المجانية: ما الذي أوقفه، وما الذي تركناه مغلقًا
العمليات
في أحد الصباحات، توقّع أحد مواقعنا لعرض القوائم عن العمل. أظهرت Cloudflare للزوار خطأ 524، واستغرق الخادم الأصلي من دقيقتين إلى ست دقائق لكل صفحة، ولم يخبرنا شيء عن ذلك لمدة عشر ساعات تقريباً. كان السبب برنامج سحب بيانات (scraper) يمر عبر بروكسيات سكنية بمعدل 225 طلباً في الثانية.
شكل الطوفان
- آلاف العناوين، من طلب إلى ثلاثة لكل عنوان. اتصالات النطاق العريض المنزلية في الولايات المتحدة وإسبانيا وفرنسا والبرازيل والمملكة المتحدة ومناطق أخرى، وهو نوع الحركة الذي تؤجره شبكات البروكسي المنزلية.
- وكلاء متصفح Chrome على أجهزة Mac، مع أرقام الإصدارات من 103 إلى 151.
- نادرًا ما يكون هناك ملف تعريف ارتباط أو حقل Referer. من بين 2,697 طلبًا أخذنا عينة منها على الخادم، حمل 4 منها ملف تعريف ارتباط و4 حقل Referer.
- نوعان من العملاء. أرسل نحو نصفهم ترويسات
Sec-Fetch-*وإشارات العميل (client hints) فارغة: وهو نص برمجي مع نسخة من سلسلة وكيل المستخدم (user agent). أرسل النصف الآخر ترويسات متصفح كاملة: وهو متصفح بدون واجهة رسومية (headless browser).
كانت كل صفحة تُعرض عند كل طلب، لذا كان كل عامل يضع مئات عمليات العرض في قائمة الانتظار ويبلغ حدّ المعالج.
لماذا لم تنجح حدود الحد الأقصى لكل عنوان
يحتسب حدّ المعدّل الطلبات لكلّ عنوان. ومع طلب واحد إلى ثلاثة من كلّ عنوان من آلاف العناوين، لا يقترب أيّ عنوان منفرد من الحدّ. وكان حظر الدول سيحجب زوّارنا. وما لم يستطع الناسخ تزويره بتكلفة زهيدة هو التصرّف كمتصفّح سبق له زيارة الموقع.
على حافة Cloudflare: ثلاث قواعد مجانية
تتيح الخطة المجانية خمس قواعد مخصّصة لـ WAF لكل منطقة. استخدمنا ثلاثًا منها، جميعها بتحدٍّ مُدار (managed challenge) بدلاً من الحظر، حتى يتمكن الشخص الذي يقع في الفخ عن طريق الخطأ من تجاوزها بالنقر:
- متصفّح وهمي: طلب GET يحتوي حقل وكيل المستخدم فيه على
Chrome/ولا يحتوي على ترويسةSec-Fetch-Mode. جميع إصدارات Chrome منذ عام 2019 ترسل هذه الترويسة. - سحوبات البيانات: طلبات صفحات من شبكات Alibaba وTencent وHuawei Cloud، حيث جاء معظم ما واجهناه.
- الطوارئ، معطّل افتراضيًا: طلب GET بدون أي ملف تعريف ارتباط (cookie) وبدون Referer. الشخص الذي زار الموقع من قبل، أو الذي يصل عبر رابط، يمر دون أي عوائق؛ أما الزاحف (scraper) الذي لا يحتفظ بملفات تعريف الارتباط فيواجه تحديًا في كل طلب. نفعل هذا الخيار فقط أثناء الفيضانات (flood)، لأنه يتحدى أيضًا من يكتب العنوان في متصفح جديد.
تسمح جميعها بمرور بوتات Cloudflare الموثّقة، ووكلاء المستخدم الذين يسمّون أنفسهم روبوتات، وعناويننا الخاصة، ومسارات API وwebhook، والملفات التي ليست صفحات. وبعد يومين، كان الفيضان لا يزال مستمراً: خلال ساعة واحدة، خضعت أكثر من 10,000 طلب لقاعدة المتصفح المزيف. جاءت أحداث الـ 10,000 التي تعيدها Cloudflare لكل استعلام من 9,627 عنواناً، ولم يتجاوز أي منها 4.
في المصدر: بوابة داخل التطبيق
النصف غير المرئي (headless) يحمل ترويسات متصفح كاملة، لذا لا تلتقطه قواعد الحافة وحدها أثناء إيقاف القاعدة الطارئة. وفي التطبيق نفسه، وضعنا وسيطاً (middleware) صغيراً أمام عارض الصفحة:
- وكيل مستخدم Chrome يفتقر إلى
Sec-Fetch-Modeأو تلميحات العميل (client hints) يحصل على خطأ 403 قبل بدء أي عمل؛ - الغريب، الذي لا يحمل أي ملفات تعريف ارتباط (cookies) خاصة بنا ولا Referer، يُخدَم فقط عندما يكون لدى العامل (worker) طاقة استيعابية فائضة، وبمعدل بضع صفحات في الثانية. فوق هذا الحد، تعرض صفحة خطأ 503 بحجم 400 بايت ملف تعريف ارتباط وتعيد التحميل بعد ثانيتين. يحصل الشخص على الصفحة في المحاولة الثانية؛ أما الزاحف (scraper) الذي لا يحتفظ بملفات تعريف الارتباط فلا يحصل عليها أبداً.
في الدقيقة الأولى، رفضت البوابة حوالي 6,700 متصفح مزيف وصرفت حوالي 6,700 غريب، بينما خدمت الغرباء بمعدل حوالي 9 صفحات في الثانية. انخفضت الطلبات البطيئة إلى الصفر، وهبطت وحدة المعالجة المركزية للعاملين من الحد الأقصى إلى 12 إلى 15 بالمئة، وهبطت ذاكرتهم من 4 إلى 5 جيجابايت لكل عامل إلى 0.65 جيجابايت.
ما تركناه مطفأً
- وضع مكافحة البوتات (Bot Fight Mode). إنه يخضع حركة المرور الآلية للتحدي ولا يمكن تجاوزه بقاعدة مخصصة على الخطة المجانية، وقد اعترض webhooks لمزود الدفع الخاص بنا.
- وضع الهجوم (Under Attack mode) للمنطقة بأكملها. إنه يمرر كل زائر وعميل API وwebhook عبر صفحة الانتظار (interstitial). القاعدة الطارئة تؤدي المهمة نفسها لطلبات صفحات الغرباء فقط.
- قاعدة تحديد معدل الطلبات في الخطة المجانية. إنها تعدّ حسب العنوان، وهو ما لا يفعّله هذا الفيضان أبداً.
- حجب زواحف الذكاء الاصطناعي. نريد أن يجدنا مساعدو البحث بالذكاء الاصطناعي، ولم تكن تلك الزواحف هي المشكلة.
الخلاصة
من السهل التعرف على فيضان عبر بروكسيات سكنية بما ينقصه: ترويسات جلب المتصفح، وملفات تعريف الارتباط، وعناوين Referer. خضع ذلك للتحدي عند الحافة، وحافظ على الغرباء ضمن ما يمكن للعاملين عرضه، وتأكد من أن شيئاً خارج الخادم يلاحظ عندما تتوقف الصفحة عن الفتح. Night Watch يجمع الثلاثة في حزمة واحدة: المراقب، والقواعد مع تبديل تلقائي للقاعدة الطارئة، والبوابة لتطبيقات الويب بـ Python.