क्या GET मापदंडों के माध्यम से कच्चे base64 एन्कोडेड स्ट्रिंग्स को पास करना सुरक्षित है?
क्या GET मापदंडों के माध्यम से कच्चे base64 एन्कोडेड स्ट्रिंग्स को पास करना सुरक्षित है?
जवाबों:
नहीं, आपको इसे url-encode करने की आवश्यकता होगी, क्योंकि base64 स्ट्रिंग्स में "+", "=" और "/" अक्षर हो सकते हैं जो आपके डेटा के अर्थ को बदल सकते हैं - एक उप-फ़ोल्डर की तरह दिखते हैं।
मान्य बेस 64 अक्षर नीचे हैं।
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
अतिरिक्त base64 चश्मा हैं। ( विशेष के लिए यहां तालिका देखें )। लेकिन अनिवार्य रूप से आपको एन्कोड करने के लिए 65 वर्णों की आवश्यकता होती है: 26 लोअरकेस + 26 अपरकेस + 10 अंक = 62।
आपको दो और ['+', '/'] और एक पैडिंग चार '=' की आवश्यकता है। लेकिन उनमें से कोई भी यूआरएल के अनुकूल नहीं है, इसलिए बस उनके लिए विभिन्न वर्णों का उपयोग करें और आप सेट हैं। ऊपर दिए गए चार्ट के मानक [[- ',' _ '] हैं, लेकिन आप अन्य वर्णों का उपयोग तब तक कर सकते हैं जब तक आप उन्हें एक ही डिकोड करते हैं, और दूसरों के साथ साझा करने की आवश्यकता नहीं होती है।
मैं सिर्फ अपने स्वयं के सहायकों को लिखने की सलाह दूंगा। आधार64_encode के लिए php मैनुअल पेज पर टिप्पणियों से इन्हें पसंद करें :
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
रॉडरिगो-सिल्वेरा के उत्तर द्वारा सुझाए अनुसार उपयोग कर रहा हूं । Url लंबाई में कुछ वर्णों को सहेजने के लिए दो नए कार्य बनाना, यह आपके घर में प्रवेश करने जैसा है, केवल दरवाजे का उपयोग करने के बजाय खिड़की से गुजरना।
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
urlencoded होना चाहिए %2C
, इसलिए मैं केवल वैरिएंट के ._-
बजाय en.wikipedia.org/wiki/Base64#Variants_summary_table का उपयोग करने का सुझाव देता हूं जो अनुगामी रहता है =-_,
@joeshmo या एक सहायक फ़ंक्शन लिखने के बजाय, आप बस बेस 64 एन्कोडेड स्ट्रिंग को urlencode कर सकते हैं। यह आपके सहायक फ़ंक्शन के समान सटीक कार्य करेगा, लेकिन दो अतिरिक्त कार्यों की आवश्यकता के बिना।
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
चरित्र से सावधान रहें यदि आप इसे जीईटी पैरामीटर के रूप में नहीं, बल्कि URL में एक पथ के रूप में पास करते हैं। यदि आप /
दोनों ओर से किसी और चीज़ से प्रतिस्थापित नहीं करते हैं तो यह आपका मार्ग बदल देगा
परिचयात्मक नोट मैं कुछ स्पष्टीकरण पोस्ट करने के लिए इच्छुक हूँ क्योंकि यहाँ कुछ उत्तर थोड़े भ्रामक थे (यदि गलत नहीं है)।
जवाब नहीं है , आप बस URL बेस स्ट्रिंग के भीतर एक बेस 64 एनकोडेड पैरामीटर पास नहीं कर सकते हैं क्योंकि प्लस चिह्न $ _GET वैश्विक सरणी के अंदर एक स्पेस में परिवर्तित हो जाते हैं। दूसरे शब्दों में, यदि आपने test.php भेजा है ? MyVar = stringwith + साइन इन करें
//test.php
print $_GET['myVar'];
परिणाम होगा:
stringwith sign
इसे हल करने का आसान तरीका यह है कि आप urlencode()
अपने बेस64 स्ट्रिंग को क्वेरी स्ट्रिंग से जोड़ने के लिए +, =, और / वर्णों से बचने के लिए% ## कोड में जोड़ें। मसलन, urlencode("stringwith+sign")
रिटर्नstringwith%2Bsign
जब आप कार्रवाई को संसाधित करते हैं, तो जब यह $ _GET वैश्विक पॉप्युलेट करता है, तो PHP क्वेरी स्ट्रिंग को स्वचालित रूप से डिकोड करने का ख्याल रखती है। उदाहरण के लिए, यदि मैंने test.php भेजा है ? MyVar = stringwith% 2Bsign को
//test.php
print $_GET['myVar'];
परिणाम होगा:
stringwith+sign
आप नहीं चाहते urldecode()
कि लौटाए गए $ _GET स्ट्रिंग + के रिक्त स्थान में बदल जाएंगे।
दूसरे शब्दों में अगर मैंने एक ही टेस्ट भेजा है। php? MyVar = stringwith% 2Bsign to
//test.php
$string = urldecode($_GET['myVar']);
print $string;
परिणाम एक अप्रत्याशित है:
stringwith sign
यह rawurldecode()
इनपुट के लिए सुरक्षित होगा , हालांकि, यह बेमानी होगा और इसलिए अनावश्यक है।
<br>
, तो आप इसे देखेंगे , इसलिए ज्यादा HTML टाइप करने की आवश्यकता नहीं है। मुझे उम्मीद है कि यह मदद करता है, मैंने आपके उत्तर को थोड़ा और भी बेहतर बनाने के लिए संपादित किया।
हां और ना।
बेस 64 का मूल चार्ट कुछ मामलों में URL में उपयोग किए जाने वाले पारंपरिक सम्मेलनों से टकरा सकता है। लेकिन कई बेस 64 कार्यान्वयन आपको URL को बेहतर तरीके से मिलान करने के लिए charset बदलने की अनुमति देते हैं या यहां तक कि एक (जैसे पायथन urlsafe_b64encode()
) के साथ आते हैं ।
आपके द्वारा सामना किया जा रहा एक अन्य मुद्दा URL की लंबाई या इसके बजाय - ऐसी सीमा का अभाव है। क्योंकि मानक किसी भी अधिकतम लंबाई को निर्दिष्ट नहीं करते हैं, ब्राउज़र, सर्वर, लाइब्रेरी और HTTP प्रोटोकॉल के साथ काम करने वाले अन्य सॉफ़्टवेयर इसकी स्वयं की सीमाओं को परिभाषित कर सकते हैं। आप इस लेख पर नज़र डाल सकते हैं: डब्ल्यूडब्ल्यूडब्ल्यू अक्सर पूछे जाने वाले प्रश्न: URL की अधिकतम लंबाई क्या है?
इसका बेस 64url एनकोड है जिसे आप ऊपर की ओर जेश्मो के कोड के विस्तार से देख सकते हैं।
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
सिद्धांत रूप में, हाँ, जब तक आप क्लाइंट या सर्वर के लिए अधिकतम url और / oor क्वेरी स्ट्रिंग लंबाई से अधिक नहीं होते हैं।
व्यवहार में, चीजें थोड़ी मुश्किल हो सकती हैं। उदाहरण के लिए, यह ASP.NET पर एक HttpRequestValidationException को ट्रिगर कर सकता है यदि मान "पर" होता है और आप अनुगामी "==" में छोड़ देते हैं।
Url सुरक्षित एनकोड के लिए, जैसे base64.urlsafe_b64encode(...)
पायथन नीचे दिए गए कोड में, मेरे लिए 100% काम करता है
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
हां, यह हमेशा सुरक्षित है। बेशक base64 शामिल हैं:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
लेकिन एक base64 एन्कोडेड स्ट्रिंग आमतौर पर नहीं है +
। +
एक रिक्त स्थान में परिवर्तित हो जाएगा, गलत डिकोड किए गए स्ट्रिंग में परिणाम। /
एक सुरक्षित पैरामीटर जोड़ी में सुरक्षित है। =
हमेशा बेस 64 एन्कोडेड स्ट्रिंग के अंत में होता है और सर्वर साइड =
सीधे हल कर सकता है।