यह JSON अपहरण के माध्यम से प्रतिक्रिया के प्रकटीकरण को रोकता है।
सिद्धांत रूप में, HTTP प्रतिसादों की सामग्री समान उत्पत्ति नीति द्वारा सुरक्षित है: एक डोमेन के पृष्ठों को दूसरे डोमेन पर पृष्ठों से जानकारी का कोई भी टुकड़ा नहीं मिल सकता है (जब तक कि स्पष्ट रूप से अनुमति नहीं दी जाती है)।
एक हमलावर एक का उपयोग करके अपनी ओर से, जैसे पर अन्य डोमेन पर पृष्ठों का अनुरोध कर सकते <script src=...>
या <img>
टैग, लेकिन यह परिणाम (हेडर, सामग्री) के बारे में कोई जानकारी नहीं मिल सकता है।
इस प्रकार, यदि आप किसी हमलावर के पृष्ठ पर जाते हैं, तो यह gmail.com से आपके ईमेल को नहीं पढ़ सकता है।
सिवाय इसके कि JSON सामग्री के अनुरोध के लिए एक स्क्रिप्ट टैग का उपयोग करते समय, JSON को हमलावर के नियंत्रित वातावरण में जावास्क्रिप्ट के रूप में निष्पादित किया जाता है। यदि हमलावर ऐरे या ऑब्जेक्ट कंस्ट्रक्टर या ऑब्जेक्ट कंस्ट्रक्शन के दौरान उपयोग की जाने वाली कुछ अन्य विधि को बदल सकता है, तो JSON में कुछ भी हमलावर के कोड से होकर गुजरेगा, और खुलासा किया जाएगा।
ध्यान दें कि यह उस समय होता है जब JSON को जावास्क्रिप्ट के रूप में निष्पादित किया जाता है, उस समय नहीं जब इसे पार्स किया जाता है।
कई प्रतिवाद हैं:
यह सुनिश्चित करना कि JSON कभी भी निष्पादित नहीं करता है
while(1);
JSON डेटा से पहले एक स्टेटमेंट देकर , Google यह सुनिश्चित करता है कि JSON डेटा को जावास्क्रिप्ट के रूप में कभी भी निष्पादित नहीं किया जाता है।
केवल एक वैध पृष्ठ ही संपूर्ण सामग्री प्राप्त कर सकता है while(1);
, और JSON के रूप में शेष को छीन सकता है।
for(;;);
उदाहरण के लिए फेसबुक पर जैसी चीजें देखी गई हैं, वैसा ही परिणाम सामने आया है।
यह सुनिश्चित करना कि JSON मान्य जावास्क्रिप्ट नहीं है
इसी तरह, JSON से पहले अमान्य टोकन जोड़ना, जैसे &&&START&&&
, यह सुनिश्चित करता है कि इसे कभी भी निष्पादित नहीं किया गया है।
हमेशा JSON को बाहर की ओर एक ऑब्जेक्ट के साथ लौटाएं
यह JSON अपहरण से बचाने के लिए OWASP
अनुशंसित तरीका है और कम घुसपैठ वाला है।
पिछले काउंटर-उपायों के समान, यह सुनिश्चित करता है कि JSON को जावास्क्रिप्ट के रूप में कभी भी निष्पादित नहीं किया जाता है।
एक मान्य JSON ऑब्जेक्ट, जब किसी चीज़ से संलग्न नहीं होता है, तो जावास्क्रिप्ट में मान्य नहीं है:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
हालांकि यह वैध JSON है:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
इसलिए, सुनिश्चित करें कि आप हमेशा प्रतिक्रिया के शीर्ष स्तर पर एक वस्तु लौटाते हैं, यह सुनिश्चित करता है कि JSON मान्य जावास्क्रिप्ट नहीं है, जबकि अभी भी वैध JSON है।
जैसा कि टिप्पणियों में @hvd द्वारा उल्लेख किया गया है, खाली वस्तु {}
वैध जावास्क्रिप्ट है, और वस्तु को खाली जानना स्वयं बहुमूल्य जानकारी हो सकती है।
उपरोक्त तरीकों की तुलना
OWASP तरीका कम घुसपैठ वाला है, क्योंकि इसमें किसी क्लाइंट लाइब्रेरी में बदलाव की आवश्यकता नहीं है, और वैध JSON को स्थानांतरित करता है। हालांकि यह अनिश्चित है कि अतीत या भविष्य के ब्राउज़र बग्स इसे हरा सकते हैं या नहीं। जैसा कि @oriadam द्वारा नोट किया गया है, यह स्पष्ट नहीं है कि डेटा त्रुटि-हैंडलिंग के माध्यम से पार्स त्रुटि में लीक किया जा सकता है या नहीं (उदाहरण के लिए window.onerror)।
Google के रास्ते को इसके लिए क्लाइंट लाइब्रेरी की आवश्यकता होती है ताकि वह स्वचालित डी-सीरियलाइज़ेशन का समर्थन कर सके और ब्राउज़र बग के बारे में अधिक सुरक्षित माना जा सके।
डेवलपर्स को गलती से JSON भेजने से बचने के लिए दोनों तरीकों को सर्वर-साइड परिवर्तनों की आवश्यकता होती है।