ToolHub
View All Posts

URL एन्कोडिंग विस्तृत विवरण: प्रतिशत एन्कोडिंग क्या है

हर बार जब आप किसी लिंक पर क्लिक करते हैं, फ़ॉर्म सबमिट करते हैं या URL टाइप करते हैं, आपका ब्राउज़र पर्दे के पीछे URL एन्कोडिंग को संभाल रहा है। URL में दिखने वाली प्रतिशत चिह्न और हेक्साडेसिमल अंकों की रहस्यमय स्ट्रिंग यादृच्छिक नहीं हैं; वे एक सावधानीपूर्वक डिज़ाइन किया गया तंत्र हैं जो इंटरनेट को विश्वसनीय रूप से काम करने में सक्षम बनाता है। URL एन्कोडिंग को समझना Web डेवलपर्स, API डिज़ाइनरों और Web तकनीक के साथ काम करने वाले किसी भी व्यक्ति के लिए आवश्यक है। यह गाइड बताती है कि URL एन्कोडिंग क्या है, यह क्यों मौजूद है, यह कैसे काम करता है, और आपको जो सुरक्षा प्रभाव जानने चाहिए।

URL एन्कोडिंग क्या है?

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

< %3C बन जाता है क्योंकि < का ASCII कोड 60 है, जो हेक्साडेसिमल में 3C है।

URL एन्कोडिंग की आवश्यकता क्यों है?

URL का विशिष्ट सिंटैक्स होता है जिसमें कुछ वर्ण विभाजक के रूप में उपयोग किए जाते हैं। प्रश्न चिह्न ? पथ को क्वेरी स्ट्रिंग से अलग करता है। & चिह्न क्वेरी पैरामीटरों को अलग करता है। बराबर का चिह्न = पैरामीटर नाम को मान से अलग करता है। फॉरवर्ड स्लैश / पथ खंडों को अलग करता है। यदि ये वर्ण प्रेषित किए जा रहे डेटा में दिखाई देते हैं, तो उन्हें सामग्री के बजाय URL संरचना के रूप में गलत तरीके से समझा जाएगा।

विचार करें कि जब कोई उपयोगकर्ता वेबसाइट पर "rock & roll" खोजता है तो क्या होता है। बिना एन्कोडिंग के, URL /search?q=rock & roll होगा। ब्राउज़र & को क्वेरी पैरामीटर सेपरेटर के रूप में व्याख्या करेगा, क्वेरी को दो पैरामीटर में विभाजित करेगा: q=rock और roll नामक दूसरा पैरामीटर (बिना मान के)। URL एन्कोडिंग इस समस्या को ठीक करता है: /search?q=rock%20%26%20roll।

प्रतिशत एन्कोडिंग कैसे काम करता है

एन्कोडिंग प्रक्रिया URI विनिर्देशन द्वारा परिभाषित सरल एल्गोरिथम का पालन करती है:

  1. गैर-आरक्षित वर्णों की पहचान: वर्ण A-Z, a-z, 0-9, -, ., _ और ~ गैर-आरक्षित हैं। उन्हें कभी भी एन्कोडिंग की आवश्यकता नहीं होती है, और वे सीधे URL में दिखाई दे सकते हैं।
  2. आरक्षित वर्णों की पहचान: वर्ण :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ; और = URL सिंटैक्स के लिए आरक्षित हैं। जब इनका उपयोग डेटा के रूप में किया जाता है न कि विभाजक के रूप में, तो इन्हें एन्कोड किया जाना चाहिए।
  3. अन्य सभी वर्णों को एन्कोड करें: गैर-आरक्षित या आरक्षित सेट में न होने वाले किसी भी वर्ण को प्रतिशत एन्कोडिंग की आवश्यकता होती है। इसमें स्पेस, नियंत्रण वर्ण, गैर-ASCII वर्ण, और ASCII रेंज के बाहर कोई भी वर्ण शामिल हैं।

गैर-ASCII वर्णों की एन्कोडिंग प्रक्रिया

गैर-ASCII वर्ण (जैसे उच्चारण अक्षर, सीआईके वर्ण और इमोजी) को अतिरिक्त चरणों की आवश्यकता होती है। सबसे पहले, वर्ण को उसके UTF-8 बाइट अनुक्रम में परिवर्तित करें। फिर प्रत्येक बाइट को अलग से प्रतिशत-एन्कोड किया जाता है। इसका मतलब है कि एक वर्ण कई प्रतिशत-एन्कोडेड ट्रिपल बना सकता है।

उदाहरण के लिए, यूरो प्रतीक (€) का UTF-8 बाइट अनुक्रम E2 82 AC है। URL एन्कोडिंग के बाद यह %E2%82%AC बन जाता है। देवनागरी अक्षर "अ" का UTF-8 अनुक्रम E0 A4 85 है, जिससे %E0%A4%85 उत्पन्न होता है। इमोजी 😀 (हंसता हुआ चेहरा) में 4-बाइट UTF-8 अनुक्रम है, जिसे %F0%9F%98%80 के रूप में एन्कोड किया जाता है।

सामान्य एन्कोडेड कैरेक्टर

नीचे दी गई तालिका सबसे आम URL-एन्कोडेड वर्ण दिखाती है:

वर्णएन्कोडिंगASCII कोडकारण
स्पेस%2032 (0x20)URL में अनुमति नहीं
!%2133 (0x21)आरक्षित (उप-डेलिमीटर)
#%2335 (0x23)आरक्षित (फ़्रैगमेंट डेलिमीटर)
$%2436 (0x24)आरक्षित (उप-डेलिमीटर)
&%2638 (0x26)आरक्षित (क्वेरी डेलिमीटर)
'%2739 (0x27)आरक्षित (उप-डेलिमीटर)
(%2840 (0x28)आरक्षित (उप-डेलिमीटर)
)%2941 (0x29)आरक्षित (उप-डेलिमीटर)
+%2B43 (0x2B)आरक्षित (क्वेरी में स्पेस)
,%2C44 (0x2C)आरक्षित (उप-डेलिमीटर)
/%2F47 (0x2F)आरक्षित (पथ डेलिमीटर)
:%3A58 (0x3A)आरक्षित (स्कीम डेलिमीटर)
;%3B59 (0x3B)आरक्षित (पैरामीटर डेलिमीटर)
=%3D61 (0x3D)आरक्षित (मान डेलिमीटर)
?%3F63 (0x3F)आरक्षित (क्वेरी डेलिमीटर)
@%4064 (0x40)आरक्षित (प्राधिकरण डेलिमीटर)
[%5B91 (0x5B)आरक्षित (IPv6 लिटरल)
]%5D93 (0x5D)आरक्षित (IPv6 लिटरल)

URL एन्कोडिंग बनाम HTML एन्कोडिंग

URL एन्कोडिंग और HTML इकाई एन्कोडिंग अक्सर भ्रमित किए जाते हैं, लेकिन उनके उपयोग पूरी तरह से अलग हैं और वे विभिन्न संदर्भों में काम करते हैं।

URL एन्कोडिंग

URL एन्कोडिंग URL में सुरक्षित ट्रांसमिशन के लिए कैरेक्टर को %XX प्रारूप में परिवर्तित करता है। यह RFC 3986 द्वारा मानकीकृत है और पथ, क्वेरी स्ट्रिंग और फ़्रैगमेंट जैसे URL घटकों पर लागू होता है।

HTML एन्कोडिंग

HTML एन्कोडिंग वर्णों को &, < और > जैसे एंटिटी संदर्भों में परिवर्तित करता है ताकि HTML दस्तावेज़ में सुरक्षित रूप से रेंडर किया जा सके। यह ब्राउज़र को सामग्री को HTML मार्कअप के रूप में व्याख्या करने से रोकता है। HTML एन्कोडिंग HTML विनिर्देश द्वारा शासित होता है।

मुख्य अंतर

पहलूURL एन्कोडिंगHTML एन्कोडिंग
संदर्भURL और URIHTML दस्तावेज़
प्रारूप%XX (प्रतिशत + हेक्साडेसिमल)या &#NNN;
< का उदाहरण%3C<
& का उदाहरण%26" का उदाहरण
%22"उद्देश्य
सुरक्षित URL ट्रांसमिशनHTML इंजेक्शन रोकेंविनिर्देश
RFC 3986HTML Living Standard HTML Living Standard

(HTML एन्कोडेड &) के रूप में लिखा जाएगा। दोनों मान्य हैं, लेकिन & को URL एन्कोड करना अधिक सही दृष्टिकोण है क्योंकि यह डेटा के इच्छित अर्थ को संरक्षित करता है।

विभिन्न प्रोग्रामिंग भाषाओं में URL एन्कोडिंग

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

JavaScript

JavaScript तीन एन्कोडिंग फ़ंक्शन प्रदान करता है, प्रत्येक का अलग व्यवहार:

// encodeURI - encodes a complete URL
// Preserves: :, /, ?, #, &, =, +, @, ;, ,, !, ~, *, ', (, )
const url = encodeURI("https://example.com/search?q=hello world");
// Result: "https://example.com/search?q=hello%20world"

// encodeURIComponent - encodes a URL component
// Encodes ALL special characters including URL delimiters
const param = encodeURIComponent("price=100&discount=20");
// Result: "price%3D100%26discount%3D20"

// Never use escape() - it is deprecated
// It does not handle Unicode correctly

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

Python

from urllib.parse import quote, quote_plus, urlencode

# quote - standard URL encoding (spaces as %20)
encoded = quote("hello world&more")
# Result: "hello%20world%26more"

# quote_plus - spaces become + instead of %20
encoded_plus = quote_plus("hello world")
# Result: "hello+world"

# urlencode - encodes a dictionary as a query string
params = {"q": "hello world", "lang": "en"}
query = urlencode(params)
# Result: "q=hello+world&lang=en"

PHP

// urlencode - spaces become +
$encoded = urlencode("hello world&more");
// Result: "hello+world%26more"

// rawurlencode - RFC 3986 compliant (spaces as %20)
$raw = rawurlencode("hello world&more");
// Result: "hello%20world%26more"

स्पेस वर्ण: %20 बनाम +

स्पेस वर्ण के दो सामान्य एन्कोडिंग हैं, और यह समझना महत्वपूर्ण है कि प्रत्येक का उपयोग कब करें:

यह अंतर महत्वपूर्ण है क्योंकि + को स्पेस के रूप में डिकोड करना केवल application/x-www-form-urlencoded डेटा के संदर्भ में सही है। URL पथ घटक में, + एक शाब्दिक प्लस चिह्न है, स्पेस नहीं। अधिकांश सर्वर-साइड फ्रेमवर्क क्वेरी स्ट्रिंग को सही ढंग से संभालते हैं, लेकिन पथ को एन्कोडिंग करते समय या कस्टम URL योजनाओं का उपयोग करते समय सूक्ष्म त्रुटियां हो सकती हैं।

सुरक्षा प्रभाव

URL एन्कोडिंग के महत्वपूर्ण सुरक्षा निहितार्थ हैं जिन्हें प्रत्येक Web डेवलपर को समझना चाहिए।

डबल एन्कोडिंग हमला

डबल एन्कोडिंग तब होती है जब डेटा को कई बार URL-एन्कोड किया जाता है। एक हमलावर %2527 जमा कर सकता है, जो पहली डिकोडिंग के बाद %27 बन जाता है, और दूसरी डिकोडिंग के बाद एकल उद्धरण ' बन जाता है। यदि सुरक्षा फ़िल्टर केवल पहली डिकोडिंग की जांच करता है, तो वह दुर्भावनापूर्ण वर्ण को याद करता है। यह इनपुट सत्यापन, क्रॉस-साइट स्क्रिप्टिंग (XSS) फ़िल्टर और SQL इंजेक्शन सुरक्षा को बाईपास कर सकता है।