क्या मैं <a href…> में ampersands को एन्कोड करता हूं?


157

मैं कोड लिख रहा हूं जो स्वचालित रूप से HTML उत्पन्न करता है, और मैं चाहता हूं कि यह चीजों को ठीक से एनकोड करें।

कहो मैं निम्नलिखित URL का लिंक तैयार कर रहा हूं:

http://www.google.com/search?rls=en&q=stack+overflow

मैं मान रहा हूं कि सभी विशेषता मान HTML- एन्कोडेड होने चाहिए। (कृपया मुझे गलत होने पर सही करें।) इसका मतलब है कि अगर मैं उपरोक्त URL को एक एंकर टैग में डाल रहा हूं, तो मुझे एम्परसैंड को &amp;इस तरह से एनकोड करना चाहिए :

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow">

क्या वो सही है?



6
@CiroSantilli: यह वास्तविक URL स्ट्रिंग्स के बारे में है; जब वे HTML विशेषताओं में दिखाई देते हैं तो वे किस प्रकार एन्कोडेड होते हैं।
जेडब्ल्यू।

जैसा कि मैं देख रहा हूं, html5 में एम्परसेंड को एन्कोडिंग हमेशा आवश्यक नहीं है, और उत्तर पुराने हैं।
क़ादीन

1
: के लिए एचटीएमएल 5 सवाल stackoverflow.com/questions/19441750/...
qdinar

जवाबों:


175

हाँ यही है। HTML संस्थाओं को HTML विशेषताओं के अंदर पार्स किया गया है, और एक आवारा &एक अस्पष्टता पैदा करेगा। क्यों तुम हमेशा लिखना चाहिए कि के &amp;बजाय सिर्फ के &अंदर सभी HTML विशेषताओं।

उस ने कहा, केवल &और उद्धरण को इनकोड करने की आवश्यकता है। यदि आपके पास éअपनी विशेषता में विशेष वर्ण हैं , तो आपको HTML पार्सर को संतुष्ट करने के लिए एन्कोड करने की आवश्यकता नहीं है।

यह ऐसा मामला हुआ करता था कि URL को गैर-ASCII वर्णों के साथ विशेष उपचार की आवश्यकता होती थी, जैसे é। आपको प्रतिशत-पलायन का उपयोग करने वालों को सांकेतिक शब्दों में बदलना था, और इस मामले में यह देना होगा %C3%A9, क्योंकि उन्हें आरएफसी 1738 द्वारा परिभाषित किया गया था । हालाँकि, RFC 1786 को RFC 3986 (URIs, यूनिफ़ॉर्म रिसोर्स आइडेंटिफ़ायर) और RFC 3987 (IRI, Internationalized Resource Identifiers) द्वारा अधिगृहीत किया गया है, जिस पर व्हाट्सऐप ने अपने काम के आधार पर यह परिभाषित करने के लिए कि उन्हें गैर-ASCII के साथ एक URL को कैसे देखना चाहिए। HTML5 के बाद से इसमें वर्ण । इसलिए अब URL में गैर-ASCII वर्णों को शामिल करना सुरक्षित है, प्रतिशत-एन्कोडेड या नहीं।


1
मुझे इस पर पूरा यकीन था, लेकिन मुझे शक का एक दुर्लभ क्षण था। पुष्टि करने के लिए धन्यवाद।
जेडब्ल्यू।

1
आप% 20 के बजाय रिक्त स्थान को "+" के रूप में भी एन्कोड कर सकते हैं - जिससे URL को पढ़ना आसान हो जाता है।
NickG

1
+ देशी iPhone मेल क्लाइंट में mailto लिंक में वर्तमान में सम्मानित नहीं है, इसके लायक क्या है।
रयान ओल्सन

1
éअभी भी एन्कोडिंग की आवश्यकता है: stackoverflow.com/questions/2742852/unicode-characters-in-urls
lulalala

4
मैं जोड़ूंगा (जैसा कि मैं बस इस गलती में गिर गया) कि अगर आप एक टेम्पलेट इंजन पर भरोसा कर रहे हैं, तो आपको जांचना चाहिए कि क्या स्वचालित रूप से HTML संस्थाओं से बचने का ख्याल रखता है या नहीं। मेरे मामले में ट्विगा ऐसा कर रहा था, और मैं गलत तरीके से &amp;सीधे उपयोग करने के बजाय टैग विशेषता में लिखने से बच रहा था &
कामाफेदर

24

वर्तमान आधिकारिक एचटीएमएल सिफारिशों के अनुसार, एम्परसेंड को &amp;इस तरह संदर्भों में बचना चाहिए । हालाँकि, ब्राउज़र को इसकी आवश्यकता नहीं है, और HTML5 CR इसे एक नियम बनाने का प्रस्ताव देता है , ताकि विशेष नियम विशेषता मानों में लागू हों। वर्तमान एचटीएमएल 5 सत्यापनकर्ता इस संबंध (देखें में पुराने हो गए हैं बग रिपोर्ट टिप्पणी के साथ)।

ऐस्पेर्संड को विशेषता मानों में बचाना संभव होगा, लेकिन वर्तमान टूल के साथ सत्यापन के अलावा, उन्हें hrefमूल्यों में बचने की कोई व्यावहारिक आवश्यकता नहीं है (और यदि आप उन्हें बचाना शुरू करते हैं, तो गलती करने का एक छोटा जोखिम है)।


4
XHTML ( असली XHTML के रूप में भेजा गया application/xhtml+xml) की सबसे अधिक संभावना हमेशा इसकी आवश्यकता होती है, हालाँकि।
19

4
इस परिवर्तन, जो अभी भी, चर्चा हो रही है बहस, और गलत समझा करने के लिए एक चेतावनी है कि &अब ठीक माना जाता है, जब तक यह "के रूप में संयुक्त राष्ट्र अस्पष्ट"। एम्परसैंड को अस्पष्ट बनाने का एक स्पष्ट तरीका यह है कि इसे पहले गैर-अंतरिक्ष वर्णों और फिर एक अर्धविराम के साथ पालन किया जाए। वह एम्परसेंड अब अस्पष्ट है, और एक पार्स त्रुटि का कारण होगा
मैटी

जैसा कि जुक्का ने कहा, निश्चित रूप से सभी एम्परसेंड्स को एन्कोडिंग करने का जोखिम है, इसलिए विचार करें कि यह कितनी संभावना है कि आपके एचआरईआर उरल्स में अर्धविराम शामिल है। बल्कि संभावना नहीं है, क्योंकि मुझे यकीन नहीं है कि मैंने कभी एक अर्धविराम के साथ एक यूआरएल देखा है। ऐसा नहीं है कि यह नहीं किया जा सकता है। इसलिए व्यावहारिक रूप से, मुझे नहीं लगता कि यह संभावना है कि हमारा उपयोग &अस्पष्ट होगा। इसलिए, हम इसे href विशेषताओं में अनएन्कोडेड का उपयोग करना जारी रखते हैं।
परिपक्वता

भागने का पूरा कारण आवश्यक है , एक अस्पष्टता की संभावना के कारण ठीक है । यह विशेष मुद्दा XSS अटैक वैक्टर, खराब रेंडरिंग या किसी भी समय 99.99% पर कोई भी प्रभाव नहीं डाल सकता है, लेकिन यह परेशान करने का कारण नहीं है। सही तरीके से भागना कठिन है और हमेशा गलतियाँ करने की संभावना होती है।
फिल

5

मैं एक नया उत्तर पोस्ट कर रहा हूं क्योंकि मुझे लगता है कि zneak के उत्तर में पर्याप्त उदाहरण नहीं हैं, HTML और URI को अलग-अलग पहलुओं और मानकों के रूप में नहीं दिखाते हैं और कुछ छोटी चीजें गायब हैं।

आपके पास लिंक ( <a href) में URL से संबंधित दो मानक हैं ।

पहला मानक RFC 1866 (HTML 2.0) है जहां "3.2.1। डेटा वर्ण" में आप उन पात्रों को पढ़ सकते हैं जिन्हें HTML विशेषता के लिए मान के रूप में उपयोग किए जाने से बचना चाहिए। (गुण स्वयं विशेष पात्रों को अनुमति नहीं देते हैं, उदाहरण के <a hr&ef="http://...लिए अनुमति नहीं है, न ही है <a hr&amp;ef="http://...।)

बाद में यह HTML 4 मानक में चला गया है , आपको जिन पात्रों से बचने की आवश्यकता है वे हैं:

<   to   &lt;
>   to   &gt;
&   to   &amp;
"   to   &quote;
'   to   &apos;

अन्य मानक RFC 3986 "जेनेरिक URI मानक" है, जहाँ URL को संभाला जाता है (यह तब होता है जब ब्राउज़र किसी लिंक का अनुसरण करने वाला होता है क्योंकि उपयोगकर्ता HTML तत्व पर क्लिक करता है)।

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

उन पात्रों से बचना महत्वपूर्ण है ताकि ग्राहक जानता है कि वे डेटा या एक सीमांकक का प्रतिनिधित्व करते हैं।

उदाहरण अनुपलब्ध:

https://example.com/?user=test&password&te&st&goto=https://google.com

उदाहरण, पूरी तरह से कानूनी URL

https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com

HTML विशेषता के मूल्य में पूरी तरह से वैध URL उदाहरण:

https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com

इसके अलावा महत्वपूर्ण परिदृश्य:

  • मूल्य के रूप में जावास्क्रिप्ट:

    <img src="..." onclick="window.location.href = &quot;https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com&quot;;">...</a>(हां, ;;सही है।)

  • JSON एक मूल्य के रूप में:

    <a href="..." data-analytics="{&quot;event&quot;: &quot;click&quot;}">...</a>

  • बची हुई चीजों के अंदर बची चीजें, डबल एन्कोडिंग, यूआरएल को यूआरएल के अंदर पैरामिटर आदि ...

    http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&amp;password=&quot;&quot;123


3

हाँ, आप परिवर्तित करना चाहिए &करने के लिए &amp;

W3C द्वारा यह html सत्यापनकर्ता उपकरण इस तरह के प्रश्नों के लिए सहायक है। यह आपको किसी विशेष पृष्ठ के लिए त्रुटियों और चेतावनियों को बताएगा।


1
मुझे यकीन नहीं है कि W3C सत्यापनकर्ता &एक त्रुटि के रूप में इसका पता लगाता है ।
क्रिस डब्ल्यूडब्ल्यू

6
वर्तमान में, W3C सत्यापनकर्ता अप्राप्त और मान्य के रूप में स्वीकार करता है। क्या इसका मतलब है कि मानक बदल गया है और एन्कोडिंग की आवश्यकता नहीं है? (यहाँ अधिकांश उत्तर पुराना बना रहे हैं)? यदि हां, तो क्या यह केवल href या किसी विशेषता पर लागू होता है?
मैटियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.