दिलचस्प पोस्ट
एक ही एएसपी.नेट एमवीसी एक्शन के कारण कई युगपत AJAX कॉल करने से ब्राउज़र को ब्लॉक करने के कारण क्यों? सफ़ल पाठ 2 कंसोल इनपुट क्या यह एक शीर्षक शैली के लिए संभव है? (और सीएसएस या जेएस के साथ?) गीट पुश त्रुटि: ऑब्जेक्ट को रिपॉज़िटरी डेटाबेस में जोड़ने के लिए अपर्याप्त अनुमति MySQL डेटा के स्वचालित या नियमित बैकअप जावा प्रतिबिंब: घोषणा आदेश में फ़ील्ड और तरीके प्राप्त करना जावा में स्ट्रिंग को कंसोल आउटपुट रीडायरेक्ट करें क्या एक विशिष्ट पंक्ति को अनदेखा कर सकते हैं? शुद्ध जावास्क्रिप्ट में मैं तत्व का वर्ग कैसे टॉगल कर सकता हूं? दो NSString ऑब्जेक्ट की तुलना करते समय "a == b" झूठा है तेजी से सरणी से यादृच्छिक तत्व प्राप्त करें स्ट्रिंग को सूची में कैसे परिवर्तित करें .war फाइल से टॉमकेट वेबपैग कॉन्फ़िग को एक्सट्रॉउटिंग दूसरे सिम से कॉल करें जावा में "कोड बहुत बड़ा" संकलन त्रुटि

कुकीज़ में अनुमत वर्ण

यह एक जल्दी है:

कुकी नाम और मूल्य दोनों में अनुमत वर्ण क्या हैं? क्या वे URL या कुछ सामान्य सबसेट के समान हैं?

मैं पूछ रहा हूँ कि मैंने हाल ही में कुकीज़ के साथ कुछ अजीब व्यवहार मारा है - उनके नाम पर और मैं बस सोच रहा हूँ कि क्या यह कुछ विशिष्ट ब्राउज़र है या यदि मेरा कोड दोषपूर्ण है

वेब के समाधान से एकत्रित समाधान "कुकीज़ में अनुमत वर्ण"

यह एक जल्दी है:

आपको लगता है कि यह होना चाहिए, लेकिन वास्तव में यह बिल्कुल नहीं है!

कुकी नाम और मूल्य दोनों में अनुमत वर्ण क्या हैं?

प्राचीन नेटस्केप cookie_spec के अनुसार संपूर्ण NAME=VALUE स्ट्रिंग है:

अर्ध-बृहदान्त्र, अल्पविराम और सफेद स्थान को छोड़कर वर्णों का अनुक्रम।

तो - काम करना चाहिए, और मुझे यहां ब्राउज़रों में ठीक लग रहा है; आपको इसके साथ परेशानी क्यों होती है?

ऊपर के निहितार्थ से:

  • = शामिल करने के लिए कानूनी है, लेकिन संभवतः अस्पष्ट है ब्राउज़र हमेशा नाम और मान को स्ट्रिंग में पहले = प्रतीक पर विभाजित करते हैं, इसलिए व्यवहार में आप VALUE में एक = प्रतीक डाल सकते हैं लेकिन NAME नहीं

इसका उल्लेख नहीं है, क्योंकि नेटस्केप ऐनक लिखने में भयानक थे, लेकिन ब्राउज़रों द्वारा लगातार समर्थित होने लगता है:

  • या तो NAME या VALUE रिक्त स्ट्रिंग हो सकते हैं

  • अगर स्ट्रिंग में कोई = चिह्न नहीं है, तो ब्राउज़र इसे रिक्त-स्ट्रिंग नाम के साथ कुकी के तौर पर लेते हैं, अर्थात Set-Cookie: foo Set-Cookie: =foo

  • जब ब्राउज़र एक रिक्त नाम के साथ एक कुकी का उत्पादन करते हैं, तो वे बराबर चिह्न छोड़ते हैं तो Set-Cookie: =bar Cookie: bar बनती है Cookie: bar

  • अल्पविराम और नामों और स्थानों में रिक्त स्थान वास्तव में काम करने लगते हैं, हालांकि बराबर चिह्न के आसपास की जगहों को छंटनी की जाती है

  • नियंत्रण अक्षर ( \x00 से \x1F प्लस \x7F ) की अनुमति नहीं है

इसका उल्लेख नहीं है और ब्राउज़र पूरी तरह से असंगत है, गैर-एएससीआईआई (यूनिकोड) वर्ण हैं:

  • ओपेरा और Google क्रोम में, वे यूटीएफ -8 के साथ कुकी हेडर को एन्कोड कर रहे हैं;
  • IE में, मशीन का डिफ़ॉल्ट कोड पृष्ठ उपयोग किया जाता है (लोकेल-विशिष्ट और कभी भी यूटीएफ -8 नहीं);
  • फ़ायरफ़ॉक्स (और अन्य मोज़िला-आधारित ब्राउज़र) प्रत्येक UTF-16 कोड बिंदु के कम बाइट का उपयोग स्वयं पर करते हैं (इसलिए आईएसओ -8859-1 ठीक है लेकिन कुछ भी गड़बड़ा हुआ है);
  • सफारी गैर-एएससीआईआई वर्णों वाले किसी भी कुकी को भेजने के लिए मना कर देता है।

इसलिए व्यवहार में आप गैर-एएससीआईआई अक्षरों के सभी कुकीज़ में उपयोग नहीं कर सकते हैं। यदि आप यूनिकोड, नियंत्रण कोड या अन्य मनमाना बाइट अनुक्रमों का उपयोग करना चाहते हैं, तो कुकी_एसपीई आपको अपनी पसंद के ऐड-हॉक एन्कोडिंग स्कीम का उपयोग करने की मांग करती है और उचित विकल्प के रूप में यूआरएल-एन्कोडिंग (जावास्क्रिप्ट के encodeURIComponent द्वारा उत्पादित) का सुझाव देती है

वास्तविक मानकों के संदर्भ में, कुकी व्यवहार को संचित करने के कुछ प्रयास किए गए हैं लेकिन कोई भी वास्तव में वास्तविक दुनिया को वास्तव में प्रतिबिंबित नहीं करता है।

  • आरएफसी 210 9 मूल नेटस्केप कुकीआईएसपीई को संहिताबद्ध और ठीक करने का एक प्रयास था इस मानक में कई और अधिक विशेष वर्णों को अस्वीकार कर दिया गया है, क्योंकि यह आरएफसी 2616 टोकन (एक - अभी भी वहां अनुमति है) का उपयोग करता है, और केवल एक उद्धृत स्ट्रिंग में अन्य वर्णों के साथ ही निर्दिष्ट किया जा सकता है कोई भी ब्राउज़र ने कभी सीमाओं को लागू नहीं किया है, उद्धृत स्ट्रिंग्स और बचने का विशेष प्रबंधन, या इस विशिष्ट विवरण में नई सुविधाएं

  • आरएफसी 2965 एक दूसरे पर चल रहा था, 210 9 को अपनाने और एक 'संस्करण 2 कुकीज़' योजना के तहत और अधिक सुविधाएँ जोड़ने कोई भी कभी भी लागू नहीं है कि या तो किसी भी। इस कल्पना के पहले संस्करण के रूप में एक ही टोकन और-उद्धृत-स्ट्रिंग सीमाएं हैं और यह उतना ही बकवास का भार है

  • आरएफसी 6265 एक HTML5-युग का प्रयास है जो ऐतिहासिक गड़बड़ी को साफ करने का प्रयास करता है। यह अभी भी वास्तविकता से मेल नहीं खाता है, लेकिन यह पहले के प्रयासों के मुकाबले बेहतर है – यह कम से कम एक ब्राउजर के समर्थन का एक सबसे कम उपसमूह है, जो किसी भी वाक्य रचना को शुरू करने के लिए नहीं है, लेकिन यह (पिछले उद्धृत स्ट्रिंग की तरह) ।

6265 में कुकी नाम अभी भी एक आरएफसी 2616 token रूप में निर्दिष्ट किया गया है, जिसका अर्थ है कि आप अल्फ़ानम से प्लस चुन सकते हैं:

 !#$%&'*+-.^_`|~ 

कुकी मान में यह औपचारिक रूप से (ब्राउज़र द्वारा फ़िल्टर्ड) नियंत्रण अक्षर और (असंगत रूप से कार्यान्वित) गैर- ASCII वर्णों को प्रतिबंधित करता है। यह अंतरिक्ष, अल्पविराम और अर्धविराम पर कुकी-एसपीईसी के निषेध को बरकरार रखता है, साथ ही इसके लिए किसी भी खराब बेवकूफों के साथ संगतता के लिए जो पहले आरएफसी को लागू करते थे, उन्होंने बैकस्लैश और उद्धरणों पर भी प्रतिबंध लगा दिया था, उद्धरण चिह्नों के अलावा पूरे मूल्य को लपेटन (लेकिन उस मामले में उद्धरण अभी भी हिस्सा हैं मूल्य, एक एन्कोडिंग योजना नहीं है)। ताकि वह आपको अल्फ़ानम से अधिक छोड़ देता है:

 !#$%&'()*+-./:<=>?@[]^_`{|}~ 

वास्तविक दुनिया में हम अभी भी मूल और सबसे खराब नेटस्केप कुकी_एसपीईक का उपयोग कर रहे हैं, इसलिए कोड जो उपभोग करता है, वह बहुत ज्यादा मुठभेड़ के लिए तैयार किया जाना चाहिए, लेकिन जो कोड कुकी तैयार करता है, वह आरएफसी 6265 में सबसेट के साथ छड़ी करने के लिए उचित है।

एएसपी.नेट में आप कुकी को लिखने से पहले इसे कूकी मान सुरक्षित रूप से एन्कोड करने के लिए System.Web.HttpUtility का उपयोग कर सकते हैं और इसे इसे पढ़ने के बाद अपने मूल रूप में परिवर्तित कर सकते हैं।

 // Encode HttpUtility.UrlEncode(cookieData); // Decode HttpUtility.UrlDecode(encodedCookieData); 

यह एम्पर्संस को रोक देगा और नाम / मान जोड़े की एक गुच्छा में एक मूल्य को विभाजित करने के संकेत के बराबर होगा क्योंकि यह किसी कुकी को लिखा है।

मुझे लगता है कि यह आम तौर पर ब्राउज़र विशिष्ट है सुरक्षित पक्ष पर होने के लिए, base64 एक JSON ऑब्जेक्ट को सांकेतिक शब्दों में बदलना, और उसमें सब कुछ संग्रहीत करें इस तरह आपको इसे डीकोड करना होगा और JSON को पार्स करना होगा। बेस 64 में इस्तेमाल किए जाने वाले सभी पात्रों को सबसे ज्यादा ठीक करना चाहिए, यदि सभी ब्राउज़र नहीं हैं

अप्रैल 2011 में प्रकाशित नया आरएफसी 6265 :

 cookie-header = "Cookie:" OWS cookie-string OWS cookie-string = cookie-pair *( ";" SP cookie-pair ) cookie-pair = cookie-name "=" cookie-value cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E ; US-ASCII characters excluding CTLs, ; whitespace DQUOTE, comma, semicolon, ; and backslash 

यदि आप @बॉबिन्स के उत्तर को देखते हैं तो आपको लगता है कि नया प्रतिबंध अधिक सख्त है

आप ";" नहीं डाल सकते किसी कुकी के मान क्षेत्र में, जो नाम सेट किया जाएगा वह ""; अधिकांश ब्राउज़रों में …

कुकीज़ विनिर्देशों के 2 संस्करण हैं
1. संस्करण 0 कुकीज़ उर्फ ​​नेटस्केप कुकीज़,
2. संस्करण 1 उर्फ ​​आरएफसी 2965 कुकीज़
संस्करण 0 में कुकीज़ का नाम और मूल्य का हिस्सा, अर्द्धविराम, अल्पविराम, बराबर चिह्न और सफेद स्थान को छोड़कर वर्णों के अनुक्रम हैं, यदि दोहरे उद्धरण चिह्नों के साथ प्रयोग नहीं किया जाता है
संस्करण 1 बहुत अधिक जटिल है, आप इसे यहां देख सकते हैं
नाम संस्करण के लिए इस संस्करण के चश्मे में नाम के बराबर लगभग समान है $ $ के साथ शुरू नहीं हो सकता

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

1 से अधिक अवधि के नाम वाले कुकीज़ चुपचाप गिराए जाते हैं। तो यह काम करता है:

cookie_name_a = valuea

जबकि यह गिरा दिया जाएगा

cookie.name.a = valuea

यह संभव है कि जितना संभव हो उतना कम शब्दों में । उन पात्रों पर ध्यान दें जिन्हें बचने की आवश्यकता नहीं है:

कुकीज़ के लिए:

 abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!#$%&'()*+-./:<>?@[]^_`{|}~ 

यूआरएल के लिए

 abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789.-_~!$&'()*+,;=:@ 

कुकीज़ और यूआरएल (प्रतिच्छेदन) के लिए

 abdefghijklmnqrstuvxyzABDEFGHIJKLMNQRSTUVXYZ0123456789!$&'()*+-.:@_~ 

आप इसका जवाब कैसे देते हैं

ध्यान दें कि कुकीज़ के लिए, = हटा दिया गया है क्योंकि यह आमतौर पर कुकी मूल्य सेट करने के लिए प्रयोग किया जाता है।

यूआरएल के लिए यह = रखा गया था चौराहे स्पष्ट रूप से बिना है

 var chars = "abdefghijklmnqrstuvxyz"; chars += chars.toUpperCase() + "0123456789" + "!$&'()*+-.:@_~"; 

अभी भी अस्तित्व में आ रहा है और अनपेक्षित होने से बचता है, विशेषकर एक जावा कुकी वातावरण में जहां कुकी को दोहरे उद्धरणों के साथ लपेटा जाता है यदि यह अंतिम वर्णों का सामना करता है।

तो सुरक्षित होने के लिए, बस ए-ज़ा-ज़ 1-9 का उपयोग करें यही है कि मैं क्या करने जा रहा हूं

साल पहले एमएसआईई 5 या 5.5 (और शायद दोनों) को एचटीएमएल ब्लॉक में एक "-" गंभीर समस्या थी, अगर आप इसे मान सकते हैं यह सीधे से संबंधित नहीं है, जब से हमने कुकी में सर्वर-साइड डाटाबेस में सब कुछ देखने के लिए एक एमडी 5 हैश (केवल अक्षरों और संख्याएं) को संग्रहीत किया है।