डेवलपर टूल · URL एनकोडर और डिकोडर
डबल URL एन्कोडिंग: %2520 कैसे होता है और इसे कैसे पहचानें और पूर्ववत करें
· यह काम किस प्रकार करता है
URL एन्कोडिंग जावास्क्रिप्ट डेवलपर-वर्कफ़्लो डिबगिंग
URL में %2520 का अर्थ है कि एक स्थान को दो बार एन्कोड किया गया था। यह पोस्ट पाइपलाइन की गलतियों के बारे में बताती है जो इसका कारण बनती हैं, हस्ताक्षर को कैसे पहचानें, और कितने डिकोड पास सुरक्षित हैं।
डबल URL एन्कोडिंग: जब %2520 का अर्थ है कि एक स्थान दो एनकोडर से होकर गुजरा
"my file.pdf" के बजाय "my%20file.pdf" नाम आना डबल एनकोडिंग का संकेत है: स्पेस को %20 में एनकोड किया गया, फिर प्रतिशत चिह्न को %25 में एनकोड करने से अंतिम URL में %2520 बना। क्लाइंट कोड, वेब फ़्रेमवर्क या रिवर्स प्रॉक्सी जैसी हर सिस्टम परत एक बार एनकोड कर सकती है। दो अलग परतें एनकोड करें तो एक कैरेक्टर बिगड़ जाता है।
डबल एन्कोडिंग सतहें अक्सर जटिल रीडायरेक्ट श्रृंखलाओं और टेम्प्लेटिंग सिस्टम में होती हैं। एक डेवलपर एक फ्रेमवर्क के अंदर एक एन्कोडेड URL उत्पन्न कर सकता है जो डिफ़ॉल्ट रूप से सभी आउटपुट को एन्कोड करता है। एक रिवर्स प्रॉक्सी या सामग्री वितरण नेटवर्क उन URL को फिर से एनकोड कर सकता है जो पहले से ही बैकएंड सिस्टम से एन्कोड किए गए हैं। पहले से एन्कोडेड मान वाला एक पैरामीटर किसी अन्य URL संरचना के अंदर नेस्ट होने से पहले फिर से एन्कोड किया जाता है।
%25 संकेत क्यों है—प्रतिशत चिह्न खुद एनकोड होता है, इसलिए %20 बदलकर %2520 और %C3%A9 बदलकर %25C3%25A9 बनता है
डबल एन्कोडिंग का स्पष्ट संकेत %25 है, जहां आप आमतौर पर URL या डेटा में एक प्रतिशत चिह्न देखने की उम्मीद करेंगे। सामान्य रूप से एन्कोडेड URL में, आप %25 को कभी नहीं देख पाएंगे जब तक कि शाब्दिक "%25" न भेजा जाए। यदि %20 के रूप में एन्कोड किया गया स्थान दोबारा एन्कोड किया जाता है, तो यह %2520 बन जाता है।
é जैसा एक उच्चारण वर्ण, जो सामान्य रूप से %C3%A9 को एन्कोड करता है, अनुक्रम में दो अलग-अलग प्रणालियों द्वारा दो बार एन्कोड किए जाने पर %25C3%25A9 बन जाता है। URL बार, लॉग और त्रुटि संदेशों में %25 पैटर्न को पहचानना सीखने से उत्पादन वातावरण में अनगिनत घंटों के निराशाजनक डिबगिंग कार्य की बचत होती है, जहां डेटा कई सेवाओं के माध्यम से प्रवाहित होता है।
जहां डबल एन्कोडिंग पेश की गई है - क्लाइंट कोड प्लस फ्रेमवर्क, रीडायरेक्ट, प्रॉक्सी और टेम्पलेट हेल्पर्स
डबल एनकोडिंग पढ़ने की आसानी और सर्वर-साइड सिस्टम की URL सही पार्स करने की क्षमता—दोनों बिगाड़ती है। "my file.pdf" नाम की फ़ाइल सही एनकोड होने पर "my%20file.pdf" बनती है। अगर एनकोडेड स्ट्रिंग को फिर—शायद किसी फ़ॉर्म से—एनकोड किया जाए, तो वह "my%2520file.pdf" बनती है।
सर्वर इसे एक बार डिकोड करता है तो "my%20file.pdf" को "my file.pdf" मानने के बजाय शाब्दिक फ़ाइल नाम समझता है। सिर्फ़ एक डिकोड पास की उम्मीद करने वाले ऐप को बिगड़ा नतीजा मिलेगा। इससे भी बुरा, केवल एक बार एनकोड हुए मान को ठीक करने के लिए दो बार डिकोड करने वाला डेवलपर अतिरिक्त पास से सही डेटा ही बिगाड़ देगा।
कारगर उदाहरण: एक समय में एक डबल एन्कोडेड URL एक पास को डिकोड करना - प्रत्येक पास से क्या पता चलता है और कब रुकना है
क्लाइंट-साइड JavaScript कोड और सर्वर-साइड फ्रेमवर्क डिफॉल्ट्स उत्पादन प्रणालियों में आकस्मिक डबल एन्कोडिंग के सबसे आम स्रोत हैं। एक JavaScript एप्लिकेशन किसी मान पर encodeURIComponent का उपयोग कर सकता है, फिर इसे सीधे एक फ्रेमवर्क में पास कर सकता है जो डिफ़ॉल्ट रूप से सभी स्ट्रिंग आउटपुट को एन्कोड करता है, जिससे प्रतिशत चिह्न को दूसरी बार एन्कोड किया जाता है। URL को साफ करने के लिए बनाई गई एक रिवर्स प्रॉक्सी परत उन मापदंडों को फिर से एनकोड कर सकती है जो पहले से ही बैकएंड एप्लिकेशन से पहले से एनकोड किए गए थे।
फ्रेमवर्क हेल्पर फ़ंक्शन के साथ उपयोगकर्ता द्वारा प्रदत्त इनपुट को जोड़कर बनाया गया एक रीडायरेक्ट URL दोनों चरणों में एक साथ एन्कोड कर सकता है। व्यावहारिक उदाहरण: एक उपयोगकर्ता HTML फॉर्म के माध्यम से "परीक्षण और मूल्य" सबमिट करता है, ब्राउज़र इसे "परीक्षण%26मूल्य" के रूप में एन्कोड करता है। फ्रेमवर्क शाब्दिक प्रतिशत पाठ को देखता है और उसे एन्कोड करता है, जिससे "test%2526value" उत्पन्न होता है। एक डिकोड "test%26value" देता है, फिर भी गलत है।
जब डबल एन्कोडिंग जानबूझकर की जाती है - एक URL को दूसरे URL के क्वेरी पैरामीटर के अंदर ले जाया जाता है
जानबूझकर डबल-एन्कोडिंग एक विशिष्ट मामले में मान्य है: जब URL को किसी अन्य URL के क्वेरी पैरामीटर के अंदर यात्रा करनी होती है। OAuth प्रवाह और लॉगिन रिटर्न-टू लिंक के लिए कभी-कभी एक पूर्ण URL को दूसरे के अंदर नेस्ट करने की आवश्यकता होती है। आंतरिक URL को पहले पूरी तरह से प्रतिशत-एन्कोड किया जाना चाहिए, फिर संपूर्ण एन्कोडेड स्ट्रिंग को बाहरी URL के पैरामीटर मान के रूप में फिर से एन्कोड किया जाना चाहिए।
यह दोहरी एन्कोडिंग इन मामलों में जानबूझकर और बिल्कुल आवश्यक है। बाहरी पैरामीटर पार्सर एक बार डिकोड होता है, जिससे स्टिल-एन्कोडेड आंतरिक URL प्राप्त होता है। आंतरिक सिस्टम फिर से डीकोड करता है, मूल URL को पुनर्प्राप्त करता है। महत्वपूर्ण कुंजी इरादे को समझना और भविष्य के अनुरक्षकों के लिए कोड टिप्पणियों में इसे स्पष्ट रूप से प्रलेखित करना है।
सामान्य गलतियाँ - कुछ भी नहीं बदलने तक डिकोडिंग, जो वैध रूप से शामिल मानों को दूषित करती है %25
क्लासिक और खतरनाक गलती बार-बार डिकोड करना है जब तक कि कुछ भी नहीं बदलता है, जो उन मूल्यों को भ्रष्ट कर देगा जिनमें वास्तविक डेटा में वैध रूप से प्रतिशत संकेत शामिल हैं। "छूट%2525" जैसा एक पैरामीटर (एक शाब्दिक "%25" का प्रतिनिधित्व करता है जिसे एक पैरामीटर मान के रूप में एन्कोड किया जाता है, फिर परिवहन के लिए फिर से एन्कोड किया जाता है) डिज़ाइन द्वारा पूरी तरह से सही है। इसे एक बार डिकोड करने पर "छूट%25" प्राप्त होता है, जो अभी भी सही है। इसे दूसरी बार डिकोड करने पर "छूट%" मिलता है, जो गलत है और जानकारी खो देता है।
एक डेवलपर मान सकता है कि "%25" एक गलती है और बार-बार डीकोड करता है, जिससे प्रतिशत चिह्न खो जाता है। इसके बजाय, जितनी बार आपका आर्किटेक्चर मांग करता है उतनी बार डीकोड करें: एक पैरामीटर के लिए एक बार, दो बार नेस्टेड। सही डिकोड संचालन जानने के लिए परतों की गणना करें।
इसमें क्या शामिल नहीं है - URL के शीर्ष पर स्तरित HTML इकाई एन्कोडिंग, जिसे HTML इकाई एस्केपर संभालता है
सामान्य गलतियों में संपूर्ण URL को encodeURIComponent के साथ एन्कोड करना और फिर स्लैश और कोलन को संरचनात्मक सीमांकक के रूप में काम करने की अपेक्षा करना शामिल है, जिसे वे एन्कोडिंग के बाद नहीं कर सकते। एक और लगातार त्रुटि विभिन्न एन्कोडिंग मानकों का मिश्रण है: कुछ कोड प्रति RFC 3986 प्रतिशत-एन्कोडिंग का उपयोग करते हैं और अन्य कोड रिक्त स्थान का प्रतिनिधित्व करने वाले प्लस चिह्नों के साथ फॉर्म एन्कोडिंग का उपयोग करते हैं। "मेरी+फ़ाइल" जैसा मान वास्तव में अस्पष्ट हो जाता है - इसका अर्थ "मेरी फ़ाइल" हो सकता है या इसका अर्थ प्लस के साथ शाब्दिक पाठ "मेरी+फ़ाइल" हो सकता है।
यदि प्रतिशत-एन्कोडिंग पहले "my+file" को छूती है, तो यह "my%2Bfile" बन जाती है। यदि प्रपत्र डिकोडिंग के बाद प्लस-एज़-स्पेस की अपेक्षा की जाती है, तो यह गलत रहता है। परतों में एकरूपता आवश्यक है। प्रत्येक सिस्टम को समान एन्कोडिंग मानक का उपयोग करना चाहिए, या प्रत्येक परत को स्पष्ट रूप से प्रलेखित किया जाना चाहिए।
टेकअवे: प्रति परत बिल्कुल एक बार एनकोड करें - कैसे URL एनकोडर और डिकोडर आपको एक समय में एक पास को डीकोड करने और प्रत्येक मध्यवर्ती परिणाम देखने की सुविधा देता है
एक बार जब आप उत्पादन प्रणालियों में होने वाली दोहरी एन्कोडिंग की सफलतापूर्वक पहचान कर लेते हैं, तो समाधान पूरी तरह से इस बात पर निर्भर करता है कि पाइपलाइन में दोहराव कहां हो रहा है। यदि क्लाइंट कोड और फ़्रेमवर्क दोनों एन्कोडिंग हैं, तो उनमें से किCAक से एन्कोडिंग को पूरी तरह से हटा दें। यदि कोई पैरामीटर एकाधिक बैकएंड सेवाओं के माध्यम से यात्रा करता है, तो प्रत्येक सेवा के माध्यम से पूर्ण पथ का पता लगाएं और पता लगाएं कि कौन सी सेवा एन्कोडिंग कर रही है जबकि उसे ऐसा नहीं करना चाहिए।
संपूर्ण एंड-टू-एंड पाइपलाइन के माध्यम से नमूना डेटा पास करके फिक्स का अच्छी तरह से परीक्षण करें और सत्यापित करें कि डेटा गंतव्य पर पूरी तरह से अपरिवर्तित है। प्रत्येक सीमा पर एन्कोडिंग धारणा को स्पष्ट रूप से दस्तावेज़ित करें: "यह समापन बिंदु प्रतिशत-एन्कोडेड पैरामीटर लौटाता है" या "यह मिडलवेयर कच्चे UTF-8 की अपेक्षा करता है और उस पर एन्कोडिंग लागू करता है"। भविष्य के डेवलपर्स के लिए उस दस्तावेज़ में अपेक्षित डिकोड पास की संख्या शामिल करें।