javascript - Google प्रीपेंड क्यों करता है(1);उनके JSON प्रतिक्रियाओं के लिए?




ajax security (6)

यह एक तीसरे पक्ष के लिए <script> टैग के साथ HTML दस्तावेज़ में JSON प्रतिक्रिया सम्मिलित करने के लिए कठिन बनाने के लिए होगा। याद रखें कि <script> टैग को समान मूल नीति से छूट दी गई है।

Google प्रीपेंड क्यों करता है while(1); उनके (निजी) JSON प्रतिक्रियाओं के लिए?

उदाहरण के लिए, Google कैलेंडर में कैलेंडर चालू और बंद करते समय यहां एक प्रतिक्रिया है:

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

मुझे लगता है कि यह लोगों को इस पर एक eval() करने से रोकने के लिए है, लेकिन आपको वास्तव में ऐसा करना होगा while आपको while और फिर आपको सेट करना होगा। मुझे लगता है कि लोगों को सुरक्षित JSON पार्सिंग कोड लिखना सुनिश्चित करने के लिए eval की रोकथाम है।

मैंने इसे अन्य स्थानों के एक जोड़े में भी उपयोग किया है, लेकिन Google (मेल, कैलेंडर, संपर्क, आदि) के साथ बहुत अधिक है। काफी अजीब है, Google डॉक्स इसके बजाय &&&START&&& शुरू होता है, और Google संपर्कों के साथ शुरू होता है while(1); &&&START&&& while(1); &&&START&&&

यहाँ क्या चल रहा है?


यह सुनिश्चित करने के लिए कुछ अन्य साइट आपके डेटा को चोरी करने की कोशिश करने के लिए बुरा चालें नहीं कर सकती हैं। उदाहरण के लिए, सरणी कंस्ट्रक्टर को बदलकर , फिर इस JSON URL को <script> टैग के माध्यम से, दुर्भावनापूर्ण तृतीय-पक्ष साइट JSON प्रतिक्रिया से डेटा चुरा सकती है। while(1); लगाकर while(1); शुरुआत में, स्क्रिप्ट इसके बजाय लटकाएगी।

XHR और दूसरी तरफ एक अलग JSON पार्सर का उपयोग करके एक ही-साइट अनुरोध, आसानी से while(1); अनदेखा कर सकता है while(1); उपसर्ग।


चूँकि <script> टैग को समान उत्पत्ति नीति से छूट दी गई है जो वेब दुनिया में सुरक्षा की आवश्यकता है, while(1) JSON प्रतिक्रिया में जोड़े जाने पर <script> टैग में इसके दुरुपयोग को रोकता है।


नोट : 2019 तक, इस प्रश्न में चर्चा की गई निवारक उपायों के लिए नेतृत्व करने वाली कई पुरानी कमजोरियां अब आधुनिक ब्राउज़रों में कोई समस्या नहीं हैं। मैं एक ऐतिहासिक जिज्ञासा के रूप में नीचे दिए गए उत्तर को छोड़ दूंगा, लेकिन वास्तव में 2010 के बाद से पूरा विषय मौलिक रूप से बदल गया है (!!) जब यह पूछा गया था।

यह इसे सरल <script> टैग के लक्ष्य के रूप में उपयोग करने से रोकता है। (ठीक है, यह इसे रोकता नहीं है, लेकिन यह इसे अप्रिय बनाता है।) इस तरह से बुरे लोग उस स्क्रिप्ट टैग को अपनी साइट पर नहीं डाल सकते हैं और अपनी सामग्री लाने के लिए इसे सक्रिय सत्र पर निर्भर करते हैं।

संपादित करें - टिप्पणी (और अन्य उत्तर) पर ध्यान दें। इस मुद्दे को विशेष रूप से Object और Array कंस्ट्रक्टरों में निर्मित सुविधाओं के साथ करना है। इन्हें ऐसे बदला जा सकता है, अन्यथा अन्यथा JSON, जब पार्स किया जाता है, हमलावर कोड को ट्रिगर कर सकता है।


यह JSON अपहरण से बचाता है, एक प्रमुख JSON सुरक्षा मुद्दा जो 2011 से ECMAScript 5 के साथ सभी प्रमुख ब्राउज़रों में औपचारिक रूप से fixed गया है।

दिए गए उदाहरण: कहते हैं कि Google में mail.google.com/json?action=inbox जैसा URL है, जो आपके इनबॉक्स के पहले 50 संदेशों को JSON प्रारूप में लौटाता है। अन्य डोमेन पर ईविल वेबसाइट एक ही मूल नीति के कारण इस डेटा को प्राप्त करने के लिए AJAX अनुरोध नहीं कर सकती हैं, लेकिन वे URL को <script> टैग के माध्यम से शामिल कर सकते हैं। URL को आपके कुकीज़ के साथ देखा जाता है, और वैश्विक सरणी निर्माता या एक्सेसर विधियों को ओवरराइड करके, जब भी कोई ऑब्जेक्ट (सरणी या हैश) विशेषता सेट की जाती है, तो उन्हें JSON सामग्री पढ़ने की अनुमति देता है।

while(1); या &&&BLAH&&& रोकता है: mail.google.com पर एक AJAX अनुरोध में पाठ सामग्री तक पूर्ण पहुंच होगी, और इसे दूर कर सकते हैं। लेकिन एक <script> टैग प्रविष्टि आँख बंद करके जावास्क्रिप्ट को बिना किसी प्रसंस्करण के निष्पादित करता है, जिसके परिणामस्वरूप या तो एक अनंत लूप या एक सिंटैक्स त्रुटि होती है।

यह क्रॉस-साइट अनुरोध जालसाजी के मुद्दे को संबोधित नहीं करता है।


1/0 का नतीजा Infinity

parseInt एक स्ट्रिंग के रूप में अपना पहला तर्क मानता है जिसका अर्थ है कि Infinity.toString() को सबसे पहले स्ट्रिंग "Infinity" उत्पादन किया जाता है। तो यह वैसे ही काम करता है जैसे आपने इसे "Infinity" को आधार 19 में दशमलव में बदलने के लिए कहा था।

आधार दशमलव में उनके दशमलव मानों के साथ अंक यहां दिए गए हैं:

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

आगे क्या होता है कि parseInt इनपुट को "Infinity" स्कैन करता है यह पता लगाने के लिए कि इसका कौन सा हिस्सा पार्स किया जा सकता है और पहले I को स्वीकार करने के बाद बंद हो जाता है (क्योंकि n 1 9 में वैध अंक नहीं है)।

इसलिए यह व्यवहार करता है जैसे कि आपने parseInt("I", 19) , जो उपरोक्त तालिका द्वारा दशमलव 18 में परिवर्तित हो जाता है।





javascript json ajax security