YamlBox

वेब और एन्कोडिंग · 5 मिनट पढ़ें

URL एन्कोडिंग: कब बचना है, और कब आप चीज़ों को तोड़ रहे हैं

यूआरएल उन वर्णों से इकट्ठे किए जाते हैं जिनका पार्सर के लिए कुछ मतलब होता है और ऐसे वर्ण जो केवल डेटा होते हैं, और प्रतिशत-एन्कोडिंग यह है कि दोनों को अलग कैसे रखा जाता है। एक URL एनकोडर बाद वाले को `%XX` एस्केप में परिवर्तित करता है ताकि `&`, `?` या एक स्थान वाला मान यात्रा से बच जाए। अधिकांश URL बग बिल्कुल भी एन्कोडिंग विफलता नहीं हैं - वे गलत भाग को एन्कोड कर रहे हैं, या दो बार एन्कोडिंग कर रहे हैं।

अद्यतन

क्या एन्कोड किया जाना चाहिए

वर्णों का एक छोटा समूह हमेशा सुरक्षित रहता है - अक्षर, अंक, `-`, `_`, `.` और `~`। बाकी सब कुछ या तो आरक्षित है या उससे बच जाना चाहिए। आरक्षित वर्ण दिलचस्प हैं, क्योंकि वे एक यूआरएल में वैध हैं, लेकिन केवल विशिष्ट स्थितियों में: `?` एक क्वेरी शुरू करता है, `&` पैरामीटर को अलग करता है, `=` एक मान निर्दिष्ट करता है, `#` एक टुकड़ा शुरू करता है, `/` पथ खंडों को अलग करता है। उनमें से एक को अनएनकोडेड मान के अंदर रखें और आपने चुपचाप यूआरएल की संरचना को फिर से लिख दिया है।

प्लस या %20

अंतरिक्ष इसका उत्कृष्ट उदाहरण है। एक पथ में, एक स्थान `%20` होना चाहिए; एक `+` एक शाब्दिक प्लस है। फॉर्म पार्सर्स द्वारा पढ़ी गई `application/x-www-form-urlencoded` बॉडी और क्वेरी स्ट्रिंग में, `+` को एक स्थान के रूप में समझा जाता है। वह विचलन यही कारण है कि कोई मान किसी ऐसी चीज़ को एनकोड कर सकता है जो एक संदर्भ में काम करती है और दूसरे में टूट जाती है, और क्यों डिकोडर दोनों व्याख्याएं पेश करते हैं।

घटकों को एन्कोड करें, संपूर्ण URL को नहीं. एक घटक एनकोडर के माध्यम से पूर्ण URL चलाने से उसका अपना `://` और `?` बच जाता है, जिससे एक लिंक उत्पन्न होता है जिसका समाधान कुछ भी नहीं होता है।

जावास्क्रिप्ट भेद जो हर किसी को पकड़ लेता है

                encodeURI('https://x.com/a b?q=1')        // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1')               // escapes ? and = — for one value
              

`encodeURI` संरचना URL को सुरक्षित रखता है और पूर्ण पते के लिए है; `encodeURIComponent` हर महत्वपूर्ण चीज़ से बच जाता है और एकल पैरामीटर मान के लिए होता है। गलत का उपयोग करने से या तो टूटा हुआ URL या एक अनएस्केप्ड मान उत्पन्न होता है, और लक्षण विपरीत होते हैं: एक लिंक जो 404 है, या एक क्वेरी स्ट्रिंग जो अपने आधे पैरामीटर खो देती है।

डबल एन्कोडिंग और हस्ताक्षरित यूआरएल

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

डिबग करने के लिए डिकोड करें

जब कोई लिंक विफल हो रहा है, तो इसे डिकोड करना यह देखने का सबसे तेज़ तरीका है कि सर्वर वास्तव में क्या मांग रहा है - और उत्तर अक्सर एक मान होता है जो संरचना में लीक हो जाता है। ब्राउज़र में काम करने का मतलब है कि आप टोकन, हस्ताक्षरित पैरामीटर या ग्राहक पहचानकर्ताओं वाले URL को कहीं भी भेजे बिना पेस्ट कर सकते हैं, जो ठीक उसी तरह का URL है जिसे आपको अनुरोधों को लॉग करने वाली सेवा में पेस्ट नहीं करना चाहिए।

URL एनकोडर / डिकोडर - अक्सर पूछे जाने वाले प्रश्न

क्या रिक्त स्थान %20 या धन चिह्न होना चाहिए?

`%20` का उपयोग पथों में और किसी URL में आप स्वयं करें; दोनों क्वेरी स्ट्रिंग्स में मान्य हैं, जहां फॉर्म पार्सर पारंपरिक रूप से `+` को एक स्थान के रूप में पढ़ते हैं। डिकोडिंग के लिए यह जानना आवश्यक है कि किस सम्मेलन ने स्ट्रिंग का उत्पादन किया।

मेरे URL को दो बार एन्कोड करने से यह क्यों टूट जाता है?

प्रत्येक पास एस्केप चरित्र से बच जाता है: एक स्थान `%20` बन जाता है, फिर `%2520`। आगमन पर सर्वर एक बार डीकोड करता है और आपके एप्लिकेशन को शाब्दिक `%20` टेक्स्ट प्राप्त होता है। एक बार एनकोड करें, उस बिंदु पर जहां एक कच्चा मान URL का हिस्सा बन जाता है।

एनकोडयूआरआई और एनकोडयूआरआईकंपोनेंट के बीच क्या अंतर है?

`encodeURI` संरचनात्मक वर्ण जैसे `://`, `?`, `&` और `=` बरकरार रखता है, इसलिए यह पूरे पते के लिए उपयुक्त होता है। `encodeURIComponent` उनसे भी बच जाता है, इसलिए यह एकल पैरामीटर मान के अनुरूप है। अधिकांश टूटे हुए जनरेट किए गए लिंक का कारण उनका मिश्रण है।

इस पोस्ट में उल्लिखित उपकरण

19 टूल की पूरी सूची ब्राउज़ करें

पढ़ने के लिए और लेख

5 मिनट पढ़ें

Base64 डिकोड और एनकोड: परिवहन के लिए, सुरक्षा के लिए नहीं

Base64 ब्राउज़र में डिकोड और एनकोड करें - 4/3 आकार नियम, पैडिंग, बेस 64url वैरिएंट और यूनिकोड बग जो डिकोड किए गए टेक्स्ट को कचरे जैसा बना देता है।

5 मिनट पढ़ें

लाने के लिए कर्ल: अनुरोध को टर्मिनल से ब्राउज़र तक ले जाना

जावास्क्रिप्ट के लिए रूपांतरण लाने के लिए कर्ल: हेडर, बॉडी, ऑथ और तरीकों को सही ढंग से मैप किया गया, साथ ही सीओआरएस वास्तविकता जो यह तय करती है कि अनुरोध काम करता है या नहीं।

6 मिनट पढ़ें

JWT डिकोडर: टोकन के अंदर क्या है, और क्या नहीं है

टोकन के हेडर, पेलोड और समाप्ति का निरीक्षण करने के लिए एक डिकोडर का उपयोग करें - और समझें कि डिकोडिंग सत्यापित क्यों नहीं हो रही है, अधिकांश 401 के पीछे दावे की जांच होती है।

सभी 19 पोस्ट →