विज्ञापन सत्यापन टूट चुका है। 2023 के एक उद्योग ऑडिट में पाया गया कि प्रमुख एक्सचेंजों के माध्यम से दिए जाने वाले 60-80 प्रतिशत प्रोग्रामेटिक विज्ञापन इम्प्रेशन, सत्यापन बॉट्स को वास्तविक उपयोगकर्ताओं की तुलना में अलग क्रिएटिव दिखाते हैं। यह क्लोकिंग है — और यह आपके द्वारा अब तक पढ़ी गई हर ब्रांड सुरक्षा रिपोर्ट को कमजोर करता है। इसका समाधान यह है कि सत्यापन क्रॉलर को एक हमलावर की तरह मानें: इसे 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 और TCP स्रोत IP को एक साथ सेट करने की अनुमति देता है।
लक्ष्य क्षेत्र में मोबाइल उपयोगकर्ता का अनुकरण करने के लिए प्रॉक्सी और कस्टम हेडर के साथ 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 बैनर होता है, जबकि मोबाइल प्रतिक्रिया एक फुल-स्क्रीन इंटरस्टीशियल लोड करती है जो फ़िशिंग पेज पर रीडायरेक्ट करता है।
JSON प्रतिक्रियाओं की तुलना करने के लिए diff या jq जैसे टूल का उपयोग करें। HTML के लिए, विशिष्ट तत्वों को निकालने के लिए htmlq या pup का उपयोग करें। मुख्य बात यह है कि उपयोगकर्ता एजेंटों, IP भू-स्थानों और रेफ़रर्स के मैट्रिक्स में तुलना को स्वचालित करना। मेरे द्वारा बनाई गई एक उत्पादन प्रणाली प्रति विज्ञापन यूनिट 16 समानांतर अनुरोध चलाती है और 5% बाइट-आकार सीमा से परे किसी भी भिन्नता को फ़्लैग करती है।
व्यापार-बंद और सीमाएँ
यह दृष्टिकोण पूर्ण नहीं है। विज्ञापन सर्वर प्रॉक्सी IP रेंज का पता लगा सकते हैं और ज्ञात प्रॉक्सी निकासों को साफ क्रिएटिव दिखा सकते हैं — उसी तरह जैसे वे सत्यापन बॉट का पता लगाते हैं। रेज़िडेंशियल प्रॉक्सी को घुमाने से मदद मिलती है लेकिन विलंबता और लागत बढ़ जाती है। साथ ही, कुछ क्लोकिंग समय-आधारित होती है: दुर्भावनापूर्ण क्रिएटिव केवल देरी के बाद या एक JavaScript ईवेंट के बाद दिखाई देता है जिसे एक साधारण curl अनुरोध ट्रिगर नहीं कर सकता। ऐसे मामलों में आपको प्रॉक्सी के पीछे एक हेडलेस ब्राउज़र (Puppeteer, Playwright) की आवश्यकता होती है, जो जटिलता और फिंगरप्रिंटेबिलिटी को बढ़ाता है।
फिर भी मूल सिद्धांत कायम है: यदि आप विभिन्न क्लाइंट फिंगरप्रिंट्स के एक विविध सेट पर बिल्कुल समान प्रतिक्रिया को पुन: उत्पन्न नहीं कर सकते, तो विज्ञापन भरोसेमंद नहीं है। HTTP प्रॉक्सी आपको उन फिंगरप्रिंट्स को प्रोग्रामेटिक रूप से बनाने का नियंत्रण देते हैं। एक सरल mitmproxy स्क्रिप्ट और कुछ प्रॉक्सी एंडपॉइंट्स से शुरुआत करें। यह अकेला ही कम-प्रयास वाले क्लोकिंग अभियानों के बहुमत को पकड़ लेगा — और इसकी लागत Python की कुछ पंक्तियों के अलावा कुछ नहीं है।