Ad Tech

التحقق من الإعلانات: اكتشاف الإبداعات المخفية باستخدام بروكسيات HTTP

4 min read Published Updated 832 words

التحقق من الإعلانات معطّل. كشف تدقيق صناعي عام 2023 أن 60-80% من مرات عرض الإعلانات البرمجية التي تُقدَّم عبر البورصات الرئيسية تُظهر محتوى إبداعيًا مختلفًا لروبوتات التحقق مقارنةً بالمستخدمين الحقيقيين. هذا هو التمويه (cloaking) — وهو يقوّض كل تقرير سلامة علامة تجارية قرأته على الإطلاق. الحل يتطلب معاملة زاحف التحقق كأنه مهاجم: توجيهه عبر وكيل HTTP، وتنويع بصمته، ومقارنة المحتوى المُقدَّم بخط أساس معروف بأنه آمن.

كيف يختار التمويه أهدافه

يعتمد التمويه على ثلاث إشارات: User-Agent و X-Forwarded-For (أو عنوان IP مباشر) و Referer. يقوم خادم إعلانات ضار بفحص الطلب الوارد ويقرر ما إذا كان الزائر روبوت تحقق أم إنسانًا. ترسل الروبوتات — مثل تلك التابعة لـ Moat أو Integral Ad Science أو DoubleVerify — ترويسات يمكن توقعها. ثم يقدم الخادم محتوى إبداعيًا نظيفًا وآمنًا للعلامة التجارية للروبوت، ومحتوى إبداعيًا ضارًا أو غير مناسب لكل الآخرين. يكون التناقض غير مرئي في لوحة تحكم المدقق.

تشمل الأمثلة الواقعية محتوى للبالغين، أو دعاية سياسية، أو إعادة توجيه إلى برمجيات خبيثة تُقدَّم فقط لمستخدمي الأجهزة المحمولة في مناطق جغرافية محددة. يتحقق المهاجم من User-Agent بحثًا عن "Mozilla/5.0 (Linux; Android …)" ومن X-Forwarded-For بحثًا عن نطاق IP ينتمي إلى بائع تحقق معروف. إذا تطابق IP، يكون الإعلان آمنًا. وإلا، يحصل المستخدم على الحمولة.

استخدام وكيل MITM لكشف التناقضات

أكثر طرق الكشف موثوقية هي تشغيل زاحف التحقق الخاص بك عبر وكيل HTTP شفاف — mitmproxy أو Burp Suite — ومقارنة الاستجابة مع طلب تحكم يُرسل بدون الوكيل. يسمح لك الوكيل بالتقاط نص الاستجابة الخام وتعديل الترويسات في الوقت الفعلي. يمكنك إعادة نفس الطلب مع User-Agent أو X-Forwarded-For مختلف ورؤية ما إذا كان خادم الإعلانات يغير المحتوى الإبداعي.

إليك نص mitmproxy بسيط يسجل التناقضات بين طلبين لنفس URL مع وكلاء مستخدم مختلفين:

# save as check_cloak.py
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    if "adserver.example.com" in flow.request.pretty_host:
        ua = flow.request.headers.get("User-Agent", "")
        if "Android" in ua:
            flow.request.headers["X-Forwarded-For"] = "1.2.3.4"  # bot IP
        else:
            flow.request.headers["X-Forwarded-For"] = "5.6.7.8"  # user IP

شغّله باستخدام mitmproxy -s check_cloak.py --listen-port 8080، ثم وجّه متصفحك أو curl نحو الوكيل. قارن نصوص الاستجابة — إذا اختلفت HTML أو الصور أو JavaScript، فلديك محتوى إبداعي مُموّه.

الزحف المستهدف جغرافيًا مع تدوير الوكيل

غالبًا ما يستخدم التمويه GeoIP كعامل تمييز إضافي. قد يقدم إعلان محتوى إبداعيًا نظيفًا للطلبات القادمة من الولايات المتحدة، لكنه يتحول إلى محتوى ضار للمستخدمين في جنوب شرق آسيا أو أوروبا الشرقية. لاصطياد هذا، يجب عليك الزحف إلى نفس URL الإعلان من نقاط نهاية جغرافية متعددة. تتيح لك مجموعة من الوكلاء السكنيين (مثل BrightData أو Oxylabs) أو سلسلة وكيل SOCKS5 ضبط X-Forwarded-For وعنوان IP المصدر TCP في آن واحد.

استخدم curl مع وكيل وترويسات مخصصة لمحاكاة مستخدم محمول في منطقة مستهدفة:

curl -x socks5://user:pass@proxy-us-east:1080 \
  -H "User-Agent: Mozilla/5.0 (Linux; Android 13; Pixel 7)" \
  -H "X-Forwarded-For: 203.0.113.50" \
  -H "Referer: https://example.com/article" \
  -o response_us.html \
  https://adserver.example.com/ad

curl -x socks5://user:pass@proxy-vietnam:1080 \
  -H "User-Agent: Mozilla/5.0 (Linux; Android 13; Pixel 7)" \
  -H "X-Forwarded-For: 42.112.0.1" \
  -H "Referer: https://example.com/article" \
  -o response_vn.html \
  https://adserver.example.com/ad

قارن بين الملفين. أي اختلاف في وسوم <script> أو سمات الصورة src يشير إلى تمويه حسب الجغرافيا.

الاختلافات بين المحتوى الإبداعي للجوال وسطح المكتب

غالبًا ما يستهدف التمويه حركة مرور الجوال لأن مستخدمي الجوال أقل عرضة لفحص طلبات الشبكة. زواحف التحقق التي تحاكي متصفحات سطح المكتب فقط تفوت هذا تمامًا. يجب عليك إرسال طلبات بسلسلتي User-Agent معًا ومقارنة الاستجابات. نمط شائع: استجابة سطح المكتب تحتوي على لافتة 300x250 قياسية، بينما استجابة الجوال تحمّل شاشة كاملة متوسطة تعيد التوجيه إلى صفحة تصيد.

استخدم أداة مثل diff أو jq لمقارنة استجابات JSON. بالنسبة لـ HTML، استخدم htmlq أو pup لاستخراج عناصر محددة. المفتاح هو أتمتة المقارنة عبر مصفوفة من وكلاء المستخدم، ومواقع IP الجغرافية، والمُحيلين. أحد الأنظمة الإنتاجية التي بنيتها يشغّل 16 طلبًا متوازيًا لكل وحدة إعلانية ويُعلّم أي تباين يتجاوز حد 5% من حجم البايت.

المقايضات والقيود

هذا النهج ليس مثاليًا. يمكن لخوادم الإعلانات اكتشاف نطاقات IP الخاصة بالوكلاء وتقديم محتوى إبداعي نظيف لمخارج الوكلاء المعروفة — بنفس الطريقة التي تكتشف بها روبوتات التحقق. يساعد تدوير الوكلاء السكنيين لكنه يزيد من زمن الوصول والتكلفة. أيضًا، بعض التمويه يعتمد على الوقت: يظهر المحتوى الإبداعي الضار فقط بعد تأخير أو بعد حدث JavaScript لا يمكن لطلب curl بسيط تشغيله. في تلك الحالات تحتاج إلى متصفح بدون واجهة رسومية (Puppeteer, Playwright) خلف الوكيل، مما يزيد من التعقيد وقابلية البصمة.

ومع ذلك، يظل المبدأ الأساسي قائمًا: إذا لم تستطع إعادة إنتاج نفس الاستجابة تمامًا عبر مجموعة متنوعة من بصمات العميل، فإن الإعلان غير موثوق. تمنحك وكلاء HTTP التحكم لبناء تلك البصمات برمجيًا. ابدأ بنص mitmproxy بسيط ومجموعة صغيرة من نقاط نهاية الوكيل. هذا وحده سيكشف غالبية حملات التمويه منخفضة الجهد — ولا يكلف شيئًا سوى بضعة أسطر من Python.