2017-09-13 19 views
15

मैं कुकीज़PHP में विस्तार से सबसे महत्वपूर्ण अवधारणा में से एक सीख रहा हूं।PHP में अंतर्निहित फ़ंक्शंस setcookie() और setrawcookie() के फ़ंक्शनिंग में वास्तविक व्यावहारिक अंतर/एस क्या हैं?

कुकीज़ मुझे पता है कि आने का अध्ययन करते समय "कुकी का मान स्वचालित रूप से प्राप्त डीकोड जब कुकी भेजने urlencoded है, और स्वचालित रूप से (URLencoding, उपयोग setrawcookie (रोकने के लिए) के बजाय)।"

ऊपर बयान इस प्रकार हैं जो मेरे मन में इतने सारे संदेह पैदा कर दी है:

  1. क्या वास्तव में के माध्यम से व्यावहारिक रूप से होता है "कुकी का मान स्वचालित रूप से भेजने के urlencoded है कुकी, और प्राप्त होने पर स्वचालित रूप से डीकोड किया गया "?
  2. क्यों setrawcookie की तरह एक और समारोह की जरूरत है() जब वहाँ पहले से ही है एक समारोह setcookie() कुकी मानों की स्थापना के लिए उपलब्ध है?
  3. URL एन्कोडिंग और यूआरएल डिकोडिंग असुरक्षित/हानिकारक/खतरनाक/धीमी गति से/कुछ और करने की प्रक्रिया इतनी है कि यह बचा जाना चाहिए है?
  4. setcookie() से setrawcookie() का उपयोग करने के लाभ/कमी क्या हैं?
  5. कौन सा सुरक्षित/बेहतर/सुरक्षित/विश्वसनीय/आदि है। setcookie() या setrawcookie()?
  6. कुकीज़ को setcookie() या setrawcookie() का उपयोग करने के बजाय $_COOKIE['cookie_variable'] = 'some_value' जैसे अन्य चर जैसे सेट नहीं किया जा सकता है?

कोई सही उपयुक्त और आसान के साथ अपने ऊपर उल्लेख किया संदेह के सभी स्पष्ट कदम-दर-कदम खस्ता के साथ कोड उदाहरण को समझने के लिए कर सकता है, स्पष्ट अर्थ का, आसान व्याख्या यह करने के लिए महान बहुत मदद की होगी समझ मुझे।

धन्यवाद।

+0

मेरी राय में एक लंबा आदेश है कि। संदेह है कि कोई भी उन सभी का जवाब देगा। – Andreas

+0

'urlencode' देखें: http://php.net/manual/en/function.urlencode.php – HostFission

उत्तर

13
  1. क्या वास्तव में के माध्यम से व्यावहारिक रूप से होता है "कुकी का मान स्वचालित रूप से कुकी भेजने urlencoded, और स्वचालित रूप से जब प्राप्त डीकोड"?

इसका मतलब है कि आपको विशेष पात्रों के बारे में चिंता करने की आवश्यकता नहीं है।

ध्यान दें कि कुकीज एक PHP अवधारणा नहीं है; वे HTTP प्रोटोकॉल का विस्तार कर रहे हैं। और प्रत्येक प्रोटोकॉल में एक कठोर संरचना होती है जिसे आपको अनुपालन करने की आवश्यकता होती है, या यह बस काम नहीं करेगी। यह संरचना delimiters - पात्रों, या वर्णों के अनुक्रमों पर निर्भर करती है जिनके पास उस प्रोटोकॉल के भीतर उन्हें निर्दिष्ट विशेष अर्थ है।
यह अनिवार्य है कि प्रत्येक प्रोटोकॉल के माध्यम से स्थानांतरित डेटा में उन विशेष chracters शामिल होंगे, और यही कारण है कि एन्कोडिंग आवश्यक है।

उदाहरण के लिए, अर्धविराम (;) Set-Cookie HTTP Header में एक विभाजक के रूप में प्रयोग किया जाता है, इसलिए यदि आपकी कुकी मूल्य यह होता है, यह एनकोड करने की आवश्यकता है या नहीं तो कुकी को ठीक ढंग ब्राउज़र द्वारा नहीं पार्स की जाने वाली जब वे इसे प्राप्त ।

आप एन्कोडिंग के बिना foo;bar के एक मूल्य के साथ कुकी, भेजते हैं, तो ब्राउज़र मूल्य foo के रूप में यह व्यवहार करेगा एक barझंडा इसे से जुड़े के साथ।
डेटा के हिस्से के रूप में आप ;bar खो देंगे, और bar प्रोटोकॉल के अनुसार एक अज्ञात ध्वज है, ब्राउज़र बस इसे अनदेखा कर देंगे, इसलिए आपको यह भी पता नहीं होगा कि कोई त्रुटि हुई है।

PHP setcookie() के साथ कुकी सेट करते समय स्वचालित रूप से एन्कोडिंग करेगा, और जब आप $_COOKIE सुपर-ग्लोबल से पढ़ते हैं तो स्वचालित रूप से इसे डीकोड करें।

  1. क्यों setrawcookie की तरह एक और समारोह की जरूरत है() पहले से ही है जब वहाँ एक समारोह setcookie() कुकी मानों की स्थापना के लिए उपलब्ध है?

मुख्य रूप से 2 के लिए कारणों:

  1. मूल्य आप भेज रहे हैं पहले से ही इनकोडिंग जा सकता है।

    आप डबल एन्कोडिंग से बचना चाहते हैं, क्योंकि सबसे अच्छा मतलब है कि आपको और अधिक काम करने की आवश्यकता है। सबसे बुरे मामले में, यह डेटा को पूरी तरह से दूषित कर सकता है (यानी आप 100% निश्चित नहीं हो सकते कि मूल डेटा क्या था)।

  2. मूल्यों को एन्कोड करने के कई तरीके हैं, और एक setcookie() उपयोग वांछनीय नहीं हो सकता है।

    यूआरएल-एन्कोडिंग अक्सर कुकी प्रारूप की तुलना में अधिक डेटा एन्कोड करता है।
    चरम मामलों में (आपको इससे कभी भी चिंतित नहीं होना चाहिए), चूंकि एन्कोडेड डेटा आमतौर पर मूल आकार में बड़ा होता है, इसलिए यह अधिकतम कुकी आकार (लगभग 4 केबी) से अधिक हो सकता है। या आप बस बैंडविड्थ को सहेजना चाहते हैं।

लेकिन भी असामान्य है कि आप 100% है कि डेटा, एन्कोडिंग की जरूरत नहीं है तो आप बस उस अनावश्यक कदम को छोड़ करना चाहते हैं पता नहीं है।

  1. डिकोडिंग असुरक्षित/हानिकारक/खतरनाक/धीमी गति से/कुछ और URL एन्कोडिंग और यूआरएल की प्रक्रिया इतनी है कि यह बचा जाना चाहिए है?

सामान्य रूप से नहीं, लेकिन इसका पहले से ही उत्तर दिया जाना चाहिए।

  1. क्या setrawcookie()setcookie() से अधिक उपयोग कर के लाभ/कमियां हैं?

दोष यह है कि यदि आवश्यक हो तो आपको मूल्यों को एन्कोड करने की आवश्यकता है।
लाभ, पहले से ही ऊपर बताए गए हैं।

  1. कौन सा सुरक्षित/बेहतर/आदि सुरक्षित/विश्वसनीय/है। setcookie() या setrawcookie()?

setcookie()cookie protocol के साथ अपरिचित लोगों से त्रुटियों के लिए कम कमरे छोड़ देता है।

लेकिन यह एक लागत पर आता है - यह धारणा है कि आप हमेशा यूआरएल-एन्कोडिंग चाहते हैं। और आमतौर पर धारणा प्रोग्रामिंग में एक बुरी चीज है।

एक नौसिखिया के लिए, setcookie() उपयोग करना आसान है।
एक विशेषज्ञ के लिए, setrawcookie() कम प्रतिबंध डालता है और इस प्रकार अधिक लचीला होता है।

न तो स्वाभाविक रूप से बेहतर है, और चूंकि आपने "सुरक्षित" का उल्लेख किया है - न ही सुरक्षा पर इसका कोई प्रभाव पड़ता है।

  1. कुकीज़ $_COOKIE['cookie_variable'] = 'some_value' बजाय setcookie() या setrawcookie() का उपयोग कर जैसे अन्य चर की तरह सेट किया जा नहीं कर सकते?

सं

5

यूआरएल एन्कोडिंग विशिष्ट वर्णों को प्रतिस्थापित करता है जिनके पास प्रतिशत-एन्कोडेड वर्णों के साथ यूआरएल/HTTP में विशेष अर्थ होता है, उदा। एक स्थान %20 बन जाता है। गोर विवरण के लिए https://en.wikipedia.org/wiki/Percent-encoding देखें।

यदि आपको किसी कुकी के लिए पहले से ही यूआरएल-एन्कोड किया गया है, तो आपको setrawcookie की आवश्यकता है। इसलिए यदि आपके पास %20 मान के साथ पहले से एन्कोडेड कुकी है, तो यदि आप setcookie का उपयोग करते हैं तो इसे %2520 पर एन्कोड किया जाएगा; setrawcookie का उपयोग करके इसे संरक्षित किया जाएगा और %20 के रूप में सेट किया जाएगा। दूसरे शब्दों में, setrawcookieका एक तरीका है "बस खराब कुकी सेट करें, मुझे पता है कि मैं क्या कर रहा हूं।" इसका उपयोग यह सुनिश्चित करने के लिए है कि कुकी प्रारूप सही ढंग से HTTP वर्ण एन्कोडिंग मानकों के अनुरूप है।

The Great Escapism (Or: What You Need To Know To Work With Text Within Text) देखें यदि आपको पहले स्थान पर एन्कोडिंग या बचने के प्रारूपों पर अधिक पृष्ठभूमि जानकारी की आवश्यकता है।

संबंधित मुद्दे