البوتات الضارة والزواحف: كيف تحمي سيرفرك دون حجب Google

تحقّق من Googlebot الحقيقي بـDNS العكسي ثم الأمامي بدل الثقة بالـUser-Agent، وطبّق حدود طلبات في Nginx واحجب مسارات wp-login وxmlrpc، وانقل الحجب الثقيل للحافة دون إفراط يخفي موقعك من البحث.
لتحمي سيرفرك من البوتات الضارة دون أن تحجب Google، لا تعتمد على اسم الـUser-Agent لأنه يُزوَّر بسطر واحد. تحقّق من Googlebot الحقيقي بـDNS العكسي ثم الأمامي: عنوان الـIP يجب أن يرجع لاسم ينتهي بـgooglebot.com أو google.com، وهذا الاسم يجب أن يرجع لنفس العنوان. بعدها طبّق حدوداً للطلبات في Nginx (مثلاً 10 طلبات في الثانية لكل IP مع هامش 20)، واحجب المسارات المستهدفة مثل xmlrpc.php وwp-login.php إن لم تكن تستخدم ووردبريس أصلاً، وانقل الحجب الثقيل إلى WAF عند الحافة حتى لا يصل الطلب لسيرفرك، مع الحذر من الإفراط لأن حجب نطاقات IP كاملة أو كل بوتات الذكاء الاصطناعي قد يخفي موقعك من نتائج البحث ومن إجابات المساعدات الذكية التي صار جزء من عملائك يسألها قبل الشراء.
كم من زياراتك بشرية فعلاً
تقارير صناعية حديثة تقدّر أن قرابة نصف حركة الإنترنت آلية، وأن أكثر من ثلثها بوتات ضارة: سرقة محتوى وأسعار، وتخمين كلمات مرور، وفحص ثغرات. على موقع شركة عادي ترى الصورة نفسها في السجلات، وغالباً تكون نسبة الطلبات البشرية بين 30% و60% فقط من إجمالي الطلبات. لا تأخذ الرقم من أحد، قِسه في سجلاتك أنت:
# أكثر 15 عنوان IP طلباً اليوم
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -15
# أكثر الـUser-Agents تكراراً
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -15
# كم طلب على مسارات ووردبريس في موقع ليس ووردبريس
grep -cE "wp-login|xmlrpc|wp-admin" /var/log/nginx/access.log
إن ظهر عنوان واحد بعشرة آلاف طلب في يوم، أو آلاف الطلبات على wp-login.php في نظام Laravel، فهذه حركة لا تجلب عميلاً واحداً لكنها تستهلك المعالج واتصالات قاعدة البيانات، وفي بعض المواقع تمثل من 20% إلى 40% من حمل السيرفر.
تمييز Googlebot الحقيقي من المزيّف
أي سكربت يستطيع إرسال User-Agent: Googlebot، ولهذا يتنكّر به الزواحف الضارة تحديداً، لأنها تعرف أن أغلب المواقع لن تجرؤ على حجبه. التحقق الصحيح خطوتان:
$ host 66.249.66.1
1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
$ host crawl-66-249-66-1.googlebot.com
crawl-66-249-66-1.googlebot.com has address 66.249.66.1
الاسم ينتهي بـgooglebot.com، والاسم يرجع لنفس العنوان، إذن هو Google فعلاً. لو توقف عند الخطوة الأولى فقط، فأي شخص يملك نطاق IP يستطيع ضبط PTR يقول أي شيء. Google تنشر أيضاً قائمة نطاقاتها بصيغة JSON، وBing يعمل بنفس الطريقة عبر search.msn.com. لا تنفّذ هذا التحقق مع كل طلب لأن DNS بطيء نسبياً، بل نفّذه على العناوين التي تتجاوز حداً معيناً وخزّن النتيجة 24 ساعة.
حدود الطلبات في Nginx
حد الطلبات هو أرخص حماية وأكثرها فاعلية، لأنه لا يحتاج أن تعرف من المهاجم، يكفي أن يتجاوز سلوكه سلوك الإنسان. إنسان يتصفح موقعك يولّد من 1 إلى 3 طلبات صفحة في الثانية في أقصى الأحوال، أما الزاحف فيطلب العشرات.
http {
# 10 طلبات في الثانية لكل IP، وذاكرة 10MB تكفي قرابة 160 ألف عنوان
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
# حد أشد لصفحات الدخول
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
limit_req_status 429;
}
server {
location / {
limit_req zone=perip burst=20 nodelay;
}
location = /login {
limit_req zone=login burst=3;
}
}
الـburst=20 مهم: الصفحة الواحدة قد تطلب 15 ملفاً من CSS وصور دفعة واحدة، وبدون هامش ستحجب زوارك الحقيقيين. الأفضل أن تستثني الملفات الثابتة من الحد أصلاً، أو تقدّمها من CDN. الرمز 429 يخبر زواحف محركات البحث المحترمة بأن تبطئ، وهذا يختلف عن 403 الذي يعني منعاً.
حجب المسارات التي لا تخصك
إن كان نظامك مبنياً على Laravel أو Django أو أي إطار غير ووردبريس، فكل طلب على wp-login.php أو xmlrpc.php أو .env هو فحص آلي مؤكد. أغلقها بأرخص طريقة ممكنة:
location ~* (wp-login\.php|xmlrpc\.php|wp-admin|/\.env|/\.git) {
return 444;
}
الرمز 444 خاص بـNginx ويغلق الاتصال دون رد، فلا يضيع السيرفر وقتاً في بناء صفحة خطأ. أما إن كنت فعلاً على ووردبريس فعطّل xmlrpc.php إن لم تستخدم تطبيق الجوال، لأنه يسمح بتجربة مئات كلمات المرور في طلب واحد، واجعل حد wp-login.php خمس محاولات في الدقيقة. أضف Fail2ban ليقرأ سجلات 429 و444 ويحظر العنوان المتكرر على مستوى الجدار الناري لمدة ساعة، فيتوقف عن الوصول لـNginx أصلاً.
WAF عند الحافة: احجب قبل أن يصل الطلب
كل طلب تحجبه على سيرفرك ما زال يستهلك اتصالاً وجزءاً من المعالج. حين يكون الهجوم بآلاف العناوين المختلفة، فحد الطلبات لكل IP لا يكفي، وهنا يأتي جدار حماية تطبيقات الويب عند الحافة، مثل خدمات CDN التي تقف أمام الموقع. قواعد عملية تبدأ بها:
| القاعدة | الإجراء | الأثر على محركات البحث |
|---|---|---|
| بوتات معروفة موثّقة (Google، Bing) | سماح | لا أثر، تبقى الفهرسة كاملة |
| User-Agent يدّعي Googlebot من عنوان غير موثق | حجب | لا أثر، لأنه ليس Google |
| أكثر من 100 طلب في 10 ثوانٍ لنفس المسار | تحدٍّ (challenge) | لا أثر إن استُثنيت البوتات الموثقة |
| مسارات الإدارة من خارج المملكة | تحدٍّ أو حجب | لا أثر، المسارات غير مفهرسة |
| حجب دول كاملة | تجنّبه | قد يمنع زواحف تعمل من تلك الدول |
انتبه لسيرفرك الأصلي: إن كان عنوانه معروفاً، فالمهاجم يتجاوز الحافة ويضربه مباشرة. اسمح على الجدار الناري لعناوين مزود الحافة فقط على المنافذ 80 و443. أما هجمات الحجم الكبير على مستوى الشبكة فلها إضافة حماية DDoS على الخادم السحابي بـ1,200 ريال سنوياً.
زواحف سرقة المحتوى والأسعار
ليست كل البوتات الضارة تبحث عن ثغرة. نوع شائع آخر ينسخ صفحاتك كاملة ليعيد نشرها، أو يسحب جداول الأسعار والمنتجات كل ساعة ليراقبك منافس. هذا النوع أذكى من الماسحات، فهو يبطئ طلباته إلى طلب كل ثانيتين أو ثلاث حتى لا يلفت النظر، ويتنقل بين مئات العناوين من شبكات بروكسي سكنية. علاماته في السجلات: جلسات طويلة تزور مئات الصفحات بالتسلسل دون أن تطلب ملفات CSS أو الخطوط، ولا تنفّذ JavaScript، ولا تحمل كوكيز من زيارة سابقة.
الحماية هنا بالسلوك لا بالعنوان. ثلاثة أساليب تعطي نتيجة جيدة بكلفة منخفضة:
- اجعل واجهات البيانات الحساسة مثل الأسعار التفصيلية تتطلب جلسة أو رمزاً قصير العمر يصدر مع الصفحة.
- ضع حداً لعدد الصفحات لكل جلسة في الساعة، مثلاً 300 صفحة، فالإنسان نادراً ما يتجاوز 50.
- استخدم تحدي الحافة للجلسات التي لا تطلب أي ملف ثابت بعد 20 صفحة.
لا تتوقع حجباً كاملاً لهذا النوع، فالهدف رفع كلفة السرقة حتى يصير موقعك هدفاً غير مجدٍ.
متى يضرك الحجب الزائد
أسوأ نتيجة لحماية متحمسة أن تختفي صفحاتك من Google دون أن تعرف. علامات ذلك في Search Console: ارتفاع أخطاء "تعذّر الزحف" أو الرمز 5xx، وانخفاض عدد الصفحات المفهرسة خلال أسبوعين. راقب هذه الأرقام بعد أي قاعدة جديدة.
الأمر نفسه مع زواحف الذكاء الاصطناعي. بعضها يجمع بيانات للتدريب، وبعضها يجلب الصفحة لحظة سؤال المستخدم ليقتبس منها الإجابة مع رابط لموقعك. حجبها كلها بقاعدة واحدة يعني أن مساعدات الذكاء لن تذكرك حين يسأل أحد عن خدمتك. قرّر لكل بوت على حدة في robots.txt:
User-agent: GPTBot
Disallow: /portal/
Allow: /
User-agent: *
Disallow: /portal/
Disallow: /admin/
الزواحف المحترمة تلتزم بـrobots.txt، أما الضارة فلا، ولهذا هو أداة لإدارة الزواحف الجيدة وليس للحماية من السيئة.
خطة تطبيق خلال يوم عمل
- حلّل سجل يوم كامل بالأوامر أعلاه، واكتب نسبة الطلبات الآلية وأكثر المسارات استهدافاً.
- فعّل
limit_reqالعام بـ10r/s مع burst=20، وحداً أشد لصفحات الدخول. - أغلق مسارات ووردبريس والملفات المخفية بـ444 إن لم تكن تحتاجها.
- أضف Fail2ban على سجلات Nginx بحظر ساعة.
- إن كان لديك حافة أو CDN، اسمح للبوتات الموثقة واحجب المزيّفة، وأغلق الأصل إلا لعناوين الحافة.
- راقب Search Console لمدة 14 يوماً بعد التغييرات.
إن كان موقعك يتباطأ تحت الحمل حتى بعد الحجب، فقد تكون المشكلة في الموارد لا في البوتات، وراجع الأسعار والباقات لترى كلفة إضافة معالج بـ500 ريال سنوياً أو ذاكرة 2GB بـ600 ريال.


