Server.UrlEncode बनाम HttpUtility.UrlEncode


जवाबों:


133

HttpServerUtility.UrlEncodeHttpUtility.UrlEncodeआंतरिक रूप से उपयोग करेगा । कोई विशेष अंतर नहीं है। अस्तित्व का कारण Server.UrlEncodeक्लासिक एएसपी के साथ संगतता है।


3
जैसे-तैसे भाग निकला। आंतरिक रूप से यह इस फ़ंक्शन को संदर्भित
जेफ़

पाठकों के लिए: कृपया नीचे जोएल मुलर के उत्तर को देखें। URL एनकोड का सबसे प्रभावी तरीका है: stackoverflow.com/a/603962/190476
सुधांशु मिश्रा

264

मेरे पास इन तरीकों के साथ महत्वपूर्ण सिरदर्द थे, मैं आपको किसी भी प्रकार के संस्करण से बचने की सलाह देता हूं UrlEncode, और इसके बजायUri.EscapeDataString - कम से कम उस व्यक्ति के पास एक व्यावहारिक व्यवहार है।

चलो देखते हैं...

HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
                                  //standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
                                        // want, since you still need to
                                        // escape special characters yourself

लेकिन मेरा व्यक्तिगत पसंदीदा HttpUtility.UrlPathEncode हो गया है - यह बात वास्तव में समझ से बाहर है। यह एन्कोड करता है:

  • "" ==> "% 20"
  • "100% सत्य" ==> "100 %% 20true" (ठीक है, अब आपका url टूट गया है)
  • "test A.aspx # anchor B" ==> "परीक्षण% 20A.aspx # लंगर% 20B "
  • "test A.aspx? hmm # anchor B" ==> "परीक्षण% 20A.aspx? hmm #anchor B " ( पिछले एस्केप अनुक्रम के साथ अंतर पर ध्यान दें! )

इसमें लवली विशिष्ट MSDN दस्तावेज़ीकरण भी है "वेब क्लाइंट से क्लाइंट के लिए विश्वसनीय HTTP ट्रांसमिशन के लिए URL स्ट्रिंग के पथ भाग को एन्कोड करता है।" - वास्तव में यह बताए बिना कि यह क्या करता है। तुम एक Uzi के साथ पैर में खुद को गोली मारने की संभावना कम है ...

संक्षेप में, Uri.EscapeDataString से चिपके रहें


4
और दुर्भाग्य से यह अभी भी कुछ वेब सर्वर के खिलाफ HTTP अनुरोध करते समय काम नहीं करता है - Uri.EscapeDataString () एनकोडिंग! " या "'", जो कि अलग-अलग ब्राउज़र कार्यान्वयन से कैसे अलग है () काम ...
क्रिस आर। डोनेली

6
! और 'वर्णों को कूटबद्ध नहीं किया जाना चाहिए; लेकिन अगर एक छोटी गाड़ी वेबसर्वर को इसकी आवश्यकता होती है, तो इसे हल करना आसान है। जावास्क्रिप्ट के बचने के कार्य से बचें - यह स्वाभाविक रूप से छोटी गाड़ी है (एक के लिए गोल करने के लिए असंभव)। देखें xkr.us/articles/javascript/encode-compare - लेकिन संक्षेप में; आप इसके बजाय encodeUriComponent () का उपयोग कर सकते हैं, जो EscapeDataString के समान व्यवहार करता है - यह अनुमानित रूप से और प्रतिवर्ती रूप से एक स्ट्रिंग को एन्कोड करता है, और एनकोड भी नहीं करता है! और 'वर्ण।
ईमोन नेरबोन

2
यह पुराना है, लेकिन यह सवाल सामने वाले पेज से टकरा गया, इसलिए .... एक यूआरएल स्ट्रिंग का पथ डोमेन और के बीच का हिस्सा है? या एक यूआरएल में #।
पॉवरलॉर्ड

2
@ समय: इसमें कई हो सकते हैं ?और जो यह कहना चाहते हैं कि इनकोडिंग करना है और जो विभाजक के रूप में काम करते हैं? अंतरिक्ष की तरह: दोनों स्थितियों में अंतरिक्ष हैश में है, इसलिए क्वेरी-खंड की मौजूदगी या अनुपस्थिति कोई मायने नहीं रखती। और अंत में, यह उड़ी को भ्रष्ट करने के लिए अक्षम्य है जैसा कि दूसरे उदाहरण में% है। UrlPathEncodeविधि सादे borked है और कभी नहीं किया जाना चाहिए।
ईमोन नेरबोन

1
मुझे लगता है कि stackoverflow.com/a/13993486/237091 पर मेरा उत्तर UrlEncode / UrlPathEncode के इच्छित उपयोग पर थोड़ा प्रकाश डाल सकता है।
स्कॉट स्टाफ़र्ड

60

यह पूछे जाने के लगभग 9 साल बाद फास्ट-फ़ॉरवर्ड, और .NET कोर और .NET मानक की दुनिया में, यह लगता है कि URL-एन्कोडिंग के लिए हमारे पास सबसे आम विकल्प हैं WebUtility.UrlEncode (अंडर System.Net) और Uri.EscapeaataString । यहां और अन्य जगहों पर सबसे लोकप्रिय जवाब को देखते हुए, Uri.EscapeDataString बेहतर प्रतीत होता है। पर है क्या? मैंने मतभेदों को समझने के लिए कुछ विश्लेषण किया और यहाँ बताया गया है कि मैं क्या कर रहा हूँ:

URL-एन्कोडिंग उद्देश्यों के लिए, वर्ण 3 श्रेणियों में से एक में फिट होते हैं: अनारक्षित (एक URL में कानूनी); सुरक्षित (में कानूनी लेकिन, विशेष अर्थ नहीं है तो तुम हो सकता है यह सांकेतिक शब्दों में बदलना चाहते हैं); और सब कुछ (हमेशा एन्कोडेड होना चाहिए)।

RFC के अनुसार , आरक्षित वर्ण हैं::/?#[]@!$&'()*+,;=

और अनारक्षित वर्ण अल्फ़ान्यूमेरिक हैं और -._~

निर्णय

Uri.EscapeDataString स्पष्ट रूप से अपने मिशन को परिभाषित करता है:% -encode सभी आरक्षित और अवैध वर्ण। WebUtility.UrlEncode परिभाषा और कार्यान्वयन दोनों में अधिक अस्पष्ट है। अजीब तरह से, यह कुछ आरक्षित वर्णों को एनकोड करता है लेकिन दूसरों को नहीं (क्यों कोष्ठक और कोष्ठक नहीं ??), और अजनबी अभी भी उस मासूम अनारक्षित ~चरित्र को एनकोड करता है ।

इसलिए, मैं लोकप्रिय सलाह के साथ सहमत हूं - जब संभव हो तो Uri.EscapeDataString का उपयोग करें , और समझें कि आरक्षित वर्ण जैसे /और ?एन्कोड हो जाएंगे। यदि आपको संभावित रूप से बड़े स्ट्रिंग से निपटने की आवश्यकता है, विशेष रूप से URL-एन्कोडेड फॉर्म सामग्री के साथ, तो आपको या तो WebUtility.UrlEncode पर वापस आना होगा और इसके क्वर्क्स को स्वीकार करना होगा, या अन्यथा समस्या के आसपास काम करना होगा।


संपादित करें: मैं कर दिया है की कोशिश की सभी quirks में उपरोक्त को सुधारने के लिए Flurl के माध्यम से Url.Encode, Url.EncodeIllegalCharactersऔर Url.Decodeस्थिर तरीके। ये मूल पैकेज में हैं (जो कि छोटा है और सभी HTTP सामान शामिल नहीं हैं), या स्रोत से उन्हें चीरने के लिए स्वतंत्र महसूस करें। मैं इन पर आपके द्वारा की गई किसी भी टिप्पणी / प्रतिक्रिया का स्वागत करता हूं।


यहाँ मैंने कोड का उपयोग किया है जो यह पता करता है कि कौन से वर्ण अलग-अलग एन्कोड किए गए हैं:

var diffs =
    from i in Enumerable.Range(0, char.MaxValue + 1)
    let c = (char)i
    where !char.IsHighSurrogate(c)
    let diff = new {
        Original = c,
        UrlEncode = WebUtility.UrlEncode(c.ToString()),
        EscapeDataString = Uri.EscapeDataString(c.ToString()),
    }
    where diff.UrlEncode != diff.EscapeDataString
    select diff;

foreach (var diff in diffs)
    Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");

2
ये जबरदस्त है!
जॉर्ज एगुइरे

1
आधुनिक .net ढांचे पर सुझाए गए समाधान की पुष्टि करने वाला महान काम।
Neowizard 17:18

यह उल्लेख किया जाना चाहिए कि WebUtility और HttpUtility के बीच कुछ अंतर हैं । WebUtility अपरकेस और HttpUtility हेक्सा संस्थाओं के लिए लोअरकेस का उपयोग कर रहा है। इसके अलावा HttpUtility .NET फ्रेमवर्क "क्लाइंट प्रोफाइल" के पुराने सबसेट संस्करणों में शामिल नहीं था। WebUtility .NET फ्रेमवर्क 4.0 से उपलब्ध है।
टिब्बा

28

ध्यान रखें कि आप शायद उन विधियों में से किसी एक का उपयोग न करें। Microsoft की एंटी-क्रॉस साइट स्क्रिप्टिंग लाइब्रेरी में प्रतिस्थापन शामिल हैं HttpUtility.UrlEncodeऔर HttpUtility.HtmlEncodeयह दोनों अधिक मानक-अनुपालन, और अधिक सुरक्षित हैं। एक बोनस के रूप में, आपको एक JavaScriptEncodeविधि भी मिलती है ।


प्रदान किए गए लिंक पर प्रलेखन और अक्सर पूछे जाने वाले प्रश्न पढ़ने के बाद, मेरा मानना ​​है कि यह उत्तर डेटा को एन्कोड करने का सबसे अच्छा और सबसे सुरक्षित तरीका है! यह साझा करने के लिए एक टन धन्यवाद!
सुधांशु मिश्रा

लिंक किसी भी अधिक काम नहीं करता है। प्रतिस्थापन के तरीके क्या हैं?
एडवर्ड ब्रे

@EdwardBrey यह एंटी-क्रॉस साइट स्क्रिप्टिंग लाइब्रेरी का नवीनतम संस्करण है: microsoft.com/en-au/download/details.aspx?id=28589
सुधांशु मिश्रा

11

Server.UrlEncode () क्लासिक एएसपी के साथ पिछड़े संगतता प्रदान करने के लिए है,

Server.UrlEncode(str);

के बराबर है:

HttpUtility.UrlEncode(str, Response.ContentEncoding);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.