जावास्क्रिप्ट को कुकीज तक पहुंच की आवश्यकता है यदि कुकीज़ पर आधारित एक्सेस प्रतिबंधों वाली साइट पर AJAX का उपयोग किया जाता है। क्या केवल कुकीज़ एक AJAX साइट पर काम करेगी?कैसे केवल कुकीज़ AJAX अनुरोधों के साथ काम करते हैं?
संपादित करें: माइक्रोसॉफ्ट ने एचएसएसपी हमलों को रोकने के लिए जावास्क्रिप्ट एक्सेस को अस्वीकार कर एक्सएसएस हमलों को रोकने के लिए एक तरीका बनाया है। फ़ायरफ़ॉक्स ने बाद में इसे अपनाया। तो मेरा सवाल यह है कि: यदि आप किसी साइट पर AJAX का उपयोग कर रहे हैं, जैसे स्टैक ओवरफ्लो, केवल कुकीज़ ही विकल्प हैं?
संपादित करें 2: प्रश्न 2. केवल Http के प्रयोजन के कुकीज़ के लिए जावास्क्रिप्ट उपयोग रोकने के लिए है, और आप अभी XMLHttpRequest ऑब्जेक्ट के माध्यम से जावास्क्रिप्ट के माध्यम से प्राप्त कर सकते हैं कुकीज़, क्या केवल Http की बात है?
संपादित करें 3: यहाँ विकिपीडिया से एक उद्धरण है:
जब ब्राउज़र इस तरह के एक कुकी प्राप्त करता है, यह निम्न HTTP एक्सचेंजों में हमेशा की तरह के रूप में उपयोग करने के लिए माना जाता है, लेकिन यह दृश्य बनाने के लिए नहीं क्लाइंट-साइड स्क्रिप्ट के लिए। [32]
HttpOnly
ध्वज किसी भी मानक का हिस्सा नहीं है, और सभी ब्राउज़रों में लागू नहीं किया गया है। ध्यान दें कि वर्तमान में XMLHTTPRequest के माध्यम से सत्र कुकी पढ़ने या लिखने की कोई रोकथाम नहीं है। [33]।
मुझे लगता है कि document.cookie
अवरुद्ध है जब आप HttpOnly का उपयोग करते हैं। लेकिन ऐसा लगता है कि आप XSS के लिए अनुमति देने वाले XMLHttpRequest ऑब्जेक्ट में अभी भी कुकी मान पढ़ सकते हैं। कैसे आपको केवल सुरक्षित से अधिक सुरक्षित बनाता है? कुकीज़ को अनिवार्य रूप से केवल पढ़ने के द्वारा?
आपके उदाहरण में, मैं आपके document.cookie
पर नहीं लिख सकता, लेकिन मैं अभी भी अपनी कुकी चुरा सकता हूं और XMLHttpRequest ऑब्जेक्ट का उपयोग करके इसे अपने डोमेन पर पोस्ट कर सकता हूं।
<script type="text/javascript">
var req = null;
try { req = new XMLHttpRequest(); } catch(e) {}
if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
req.open('GET', 'http://stackoverflow.com/', false);
req.send(null);
alert(req.getAllResponseHeaders());
</script>
संपादित 4: क्षमा करें, मैं मतलब आप StackOverflow डोमेन के लिए XMLHttpRequest भेजने कि हो सकता है, और उसके बाद() एक स्ट्रिंग के लिए, getAllResponseHeaders का परिणाम बचाने regex आउट कुकी, और उसके बाद करने के लिए है कि पोस्ट एक बाहरी डोमेन। ऐसा लगता है कि विकिपीडिया और ha.ckers इस पर मेरे साथ सहमत हैं, लेकिन मैं फिर से शिक्षित किया जाना ...
अंतिम संपादित करें प्यार होता: आह, जाहिरा तौर पर दोनों साइटों गलत कर रहे हैं, यह वास्तव में एक bug in FireFox है। आईई 6 & 7 वास्तव में एकमात्र ब्राउज़र हैं जो वर्तमान में पूरी तरह से पूरी तरह से समर्थन करते हैं।
सब कुछ मैंने सीखा है दोहराना करने के लिए:
- केवल Http IE7 & और Firefox में document.cookie की असीमित एक्सेस (यकीन नहीं अन्य ब्राउज़र के बारे) को प्रतिबंधित करता है
- केवल Http में प्रतिक्रिया हेडर से कुकी जानकारी को हटा IE7 में XMLHttpObject.getAllResponseHeaders()।
- XMLHttpObjects केवल उनके द्वारा उत्पन्न डोमेन पर सबमिट किए जा सकते हैं, इसलिए कुकीज़ का कोई क्रॉस-डोमेन पोस्टिंग नहीं है।
संपादित करें: यह जानकारी अब तक अद्यतित नहीं है।
मैंने आपके उदाहरण को greasemonkey स्क्रिप्ट में फेंक दिया और ऐसा लगता है कि एफएफ अब कुकीज़ प्रदर्शित नहीं करता है। उत्कृष्ट शोध और उदाहरण। –
शायद मूल उत्पत्ति नीति के साथ आप किसी डोमेन को http अनुरोध नहीं कर सकते हैं जो स्क्रिप्ट चल रहा है वही नहीं है; हालांकि, मुझे विश्वास है कि आप उपयोगकर्ता को window.location का उपयोग करके उपयोगकर्ता को पृष्ठ पर रीडायरेक्ट करके आसानी से कुकीज़ पास कर सकते हैं और क्वेरी स्ट्रिंग पैरामीटर के माध्यम से जानकारी को पास कर सकते हैं। –