जेएस में document.cookie से कुकीज़ का उपयोग नहीं कर सकते, लेकिन ब्राउज़र कुकीज़ मौजूद दिखाता है


79

मैं जावास्क्रिप्ट से किसी भी कुकी का उपयोग नहीं कर सकता। मुझे अपने कस्टम चेक के लिए JSON के माध्यम से कुछ मूल्य पढ़ने और भेजने की आवश्यकता है।

मैंने JS से कुकीज़ तक पहुँचने की कोशिश की है, जैसे कि इसमें वर्णित किया गया था:

जैसा कि आप कोड में देख सकते हैं, यह अगले क्रिस्टल के रूप में स्पष्ट है:

var c_value = document.cookie;

जब मैं document.cookieChrome के वेब-डीबगर से मान को एक्सेस करने का प्रयास कर रहा हूं , तो मैं घड़ी के भावों में केवल खाली स्ट्रिंग देखता हूं :

इसलिए मैं कुकीज़ मूल्य नहीं पढ़ सकता, जिसकी मुझे आवश्यकता है।

मैंने कुकी नाम की जाँच की है, जिसे मैं संबद्ध मूल्य IS सही पाने के लिए भेज रहा हूँ। साथ ही, यदि आप रुचि रखते हैं (लेकिन दूसरी कड़ी से, तकनीक समान है), तो मैं कुकीज़ प्राप्त करने के लिए W3Schools स्रोत कोड का उपयोग कर रहा हूं ।

मैं अपना मुद्दा कैसे ठीक कर सकता हूं?


1
@PeeHaa सच में? मुझे नहीं पता। मैं ASP.NET MVC 4 (रेजर) परियोजना के तहत काम कर रहा हूं, और यह नहीं जानता कि यह डिफ़ॉल्ट रूप से इस पैरामीटर को सक्षम करने का समर्थन करता है। मुझसे नाराज़ मत होना :) मैं वेब-डेवलपमेंट के लिए नौसिखिया हूँ।

2
अपने ब्राउज़र में कुकी का निरीक्षण करें और यह कहना चाहिए कि यह httponly है या नहीं।
पेहा जूल

1
@PeeHaa मैंने निरीक्षण किया है, अगर क्रोम के वेबटूल में कुकीज़ दर्शक की मेज पर HTTP कॉलम में एक चेक है, तो क्या इसका मतलब यह है कि मेरे कुकीज़ HTTP केवल हैं? यदि हां, तो मेरी परियोजना HTTP केवल कुकीज़ का उपयोग करती है और मुझे समझ में नहीं आता है कि मैं अपने मुद्दे को कैसे ठीक करूं :(

1
@PeeHaa हाँ, मेरा ऐसा नियंत्रण है। कुकीज़ सर्वर-साइड प्रतिक्रिया द्वारा सेट कर रहे हैं। मैं अपने ASP.NET MVC4 प्रोजेक्ट में C # का उपयोग कर रहा हूं। भाग मैं कुकीज़ सेट कर रहा हूँ: ideone.com/fBqtke

1
@PeeHaa तो, क्या आपके पास सुझाव हैं, इसे कैसे ठीक करें? मैं अभी गुगली कर रहा हूं। सभी वेबसाइटें सुझाव देती हैं कि document.cookieHttp कॉलम के तहत मेरे सभी कुकी और चेक दिखाते हुए Chrome के वेबटूल का उपयोग करें। यह क्यों से सुलभ नहीं है document.cookie?

जवाबों:


129

आप httponlyकुकीज़ से निपटने की सबसे अधिक संभावना है । httponlyएक ध्वज है जिसे आप कुकीज़ पर सेट कर सकते हैं जिसका अर्थ है कि उन्हें जावास्क्रिप्ट द्वारा एक्सेस नहीं किया जा सकता है। यह संवेदनशील डेटा या यहां तक ​​कि पूरे सत्र के साथ दुर्भावनापूर्ण स्क्रिप्ट को कुकीज़ चोरी करने से रोकने के लिए है।

इसलिए आपको या तो httponlyध्वज को अक्षम करना होगा या आपको अपनी जावास्क्रिप्ट में डेटा प्राप्त करने के लिए एक और तरीका खोजना होगा।

अपने कोड को देखकर http केवल ध्वज को अक्षम करना आसान होना चाहिए:

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

अब आपको जावास्क्रिप्ट से कुकी जानकारी तक पहुंचने में सक्षम होना चाहिए। हालाँकि मुझे नहीं पता कि आप किस तरह का डेटा प्राप्त करने की कोशिश कर रहे हैं, हो सकता है कि आप इसके बजाय दूसरे दृष्टिकोण के लिए जा सकें और उदाहरण के लिए, कुकी को पढ़ने की कोशिश करने के बजाय आपके द्वारा आवश्यक जानकारी के साथ पृष्ठ पर कुछ डेटा विशेषता प्रदान करें:

<div id="example" data-info="whatever data you are trying to retrieve"></div>

console.log(document.getElementById('example').getAttribute('data-info'));

इसके अलावा! वैसे मुझे कई जानकारी मिली है, कि HttpOnly वास्तव में रक्षा नहीं करता है और सेट नहीं किया जा सकता है। आपने इस बारे में क्या सोचा?

httponly एक सिल्वरबुललेट नहीं है। लेकिन यह विशिष्ट प्रकार के हमलों से आपकी रक्षा करेगा। owasp.org/index.php/HttpOnly
PeeHaa

3

मैं कहूंगा कि http केवल आपका पहला अपराधी है, लेकिन यह आपके कुकी के दायरे को सेट न करने से भी हो सकता है।

यदि साइट को किसी अन्य डोमेन से पुनर्निर्देशित किया गया है, तो आपको कुकी के दायरे को निर्धारित करने की आवश्यकता होगी। डोमेन और पाथ कुकी के दायरे को परिभाषित करता है, जिसे कुकी को URL भेजा जाना चाहिए। इस पर निर्भर करते हुए, आप अपनी प्रतिक्रिया में कुकी को नहीं देख सकते हैं।

जब मैं एक सफल एसएएमएल एसएसओ लॉगिन पर कुकी सेट कर रहा था, तो मैं इस मुद्दे पर भाग गया था और दस्तावेज़ से कुकी को पुनः प्राप्त नहीं कर सका क्योंकि यह अनुरोध के हिस्से के रूप में कभी नहीं भेजा गया था।


3

कुकी के पथ विशेषता पर भी नज़र रखें, क्योंकि कुकी केवल पथ के अंतर्गत उपनिर्देशिकाओं के लिए दिखाई देती है। मेरे पास आपका मुद्दा था और मैंने पथ "/" को हल किया


1

मुझे कई बार यही समस्या थी। और हर बार, यह एक अलग कारण के लिए था।

विभिन्न कारणों से:

  • httpOnlyक्षेत्र की समस्या । इसे सेट किया गया था falseऔर मैं इसे कंसोल से एक्सेस करने का प्रयास कर रहा था। इसे trueसोर्स कोड से सेट करना या इसे एक्सेस करना ट्रिक का काम करता था।
  • secureक्षेत्र की समस्या । यह था trueऔर मैं केवल http का उपयोग कर रहा था।
  • की समस्या Expires / Max-Age। कुकी पुरानी थी और उसमें दिखाई नहीं दे रही थी document.cookie

0

यदि आपकी कुकी सेट है Set-Cookieया Set-Cookie2यह प्रतिक्रिया हेडर संग्रह का हिस्सा नहीं है: http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29-method

प्रतिक्रिया से सभी हेडर लौटाता है, उन लोगों के अपवाद के साथ जिनके क्षेत्र का नाम सेट-कुकी या सेट-कुकी 2 है।


0

यदि आप कुछ सुरक्षित प्रमाणीकरण का उपयोग कर रहे हैं, तो उस स्थिति में आप सुरक्षित होने के कारण सीधे कुकीज़ तक नहीं पहुँच सकते। आपको नीचे कोड का उपयोग करके सर्वर पक्ष में कुछ प्रतिक्रिया विशेषता को बदलना होगा।

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

लेकिन आपको ऐसा नहीं करना चाहिए क्योंकि यह सुरक्षित से अन-सिक्योर में बदल सकता है, इसलिए आपको समाधान निकालना होगा जो कि कुकीज़ को हटाने के लिए सर्वर साइड में किया जाए और आपको कुछ ऑपरेशन करने की अनुमति दे।

सर्वर साइड में बदलाव संभव है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.