URLDecode


15

के बाद क्वेरीस्ट्रिंग विकृत है, मैं बेस 64 स्ट्रिंग में एक C# .Net वेब एप्लिकेशन को QueryString के माध्यम से पास करने का प्रयास कर रहा हूं। जब स्ट्रिंग आती है तो "+" (प्लस) चिह्न एक स्थान से प्रतिस्थापित किया जा रहा है। ऐसा प्रतीत होता है कि स्वचालित URLDecode प्रक्रिया यह कर रही है। QueryString के माध्यम से क्या पारित किया जा रहा है पर मेरा कोई नियंत्रण नहीं है। क्या इस सर्वर की तरफ से संभालने का कोई तरीका है?

उदाहरण:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

का उत्पादन:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg== 

लोग क्वेरी स्ट्रिंग URLEncoding का सुझाव दिया है:

System.Web.HttpUtility.UrlEncode(yourString) 

मैं नहीं कर सकता कि मैं फोन करने पर कोई नियंत्रण नहीं के रूप में दिनचर्या (जो अन्य भाषाओं के साथ ठीक काम कर रहा है)।

वहाँ भी प्लस के चिन्ह रिक्त स्थान की जगह का सुझाव था:

Request.QueryString["VLTrap"].Replace(" ", "+"); 

मैं इस की, हालांकि था, लेकिन इसके साथ मेरी चिंता का विषय है, और मैं इस शुरू करने के लिए उल्लेख किया जाना चाहिए था, कि मैं नहीं है पता है कि अन्य वर्ण प्लस साइन के अलावा विकृत हो सकते हैं।

मेरा मुख्य लक्ष्य डिकोडर के माध्यम से चलाने से पहले क्वेरीरीस्ट्रिंग को रोकना है।

इस अंत में मैंने Request.QueryString.toString() को देखने का प्रयास किया लेकिन इसमें वही विकृत जानकारी शामिल थी। क्या से पहले कच्चे QueryString को देखने का कोई तरीका है, यह URLDecoded है?

आगे परीक्षण के बाद ऐसा लगता है कि .Net अपेक्षा करता है कि QuerString से आने वाली सभी चीज़ों को यूआरएल एन्कोड किया जाए लेकिन ब्राउजर स्वचालित रूप से जीईटी अनुरोधों को एन्कोड नहीं करता है।

  0

ठीक तो अब मैं ऐसा कैसे काम करता है पर नुकसान में पूरी तरह से कर रहा हूँ:</p> <p>इस ब्लॉग पोस्ट देखें।प्रश्न स्पष्ट रूप से बताता है कि QueryString में जो कुछ भी पारित किया गया है उसे बदलने का कोई तरीका नहीं है, लेकिन सभी सही उत्तरों (यानी, बेस 64-डीकोडिंग से पहले प्लस के साथ स्थान को प्रतिस्थापित करें) को वोट दिया गया है। आंकड़े जाओ ... 23 sep. 082008-09-23 22:32:06

11

आप मैन्युअल रूप से मूल्य (argument.Replace(' ', '+')) HttpRequest.ServerVariables["QUERY_STRING"] (और भी बेहतर HttpRequest.Url.Query) की जगह या परामर्श और यह अपने आप को पार्स सकता है माना जाता नहीं कर रहे हैं।

हालांकि आपको समस्या को हल करने का प्रयास करना चाहिए जहां यूआरएल दिया गया है; एक प्लस साइन को यूआरएल में "% 2 बी" के रूप में एन्कोड करने की आवश्यकता होती है क्योंकि प्लस अन्यथा एक स्पेस का प्रतिनिधित्व करता है।

यदि आप इनबाउंड यूआरएल को नियंत्रित नहीं करते हैं, तो पहले विकल्प को प्राथमिकता दी जाएगी क्योंकि आप इस तरह से सबसे अधिक त्रुटियों से बचते हैं।

+2

ऐसा करने का सबसे आसान तरीका Uri.EscapeDataString/Uri.UnescapeDataString का उपयोग करना है। 09 dec. 112011-12-09 20:46:47


1

यदि आप यूआरएल में जोड़ने से पहले स्ट्रिंग को यूआरएलएनकोड करते हैं तो आपको इनमें से कोई भी समस्या नहीं होगी (स्वचालित यूआरएलडीकोड इसे मूल स्थिति में वापस कर देगा)।


0

मैं किसी भी तरह से सी # डेवलपर नहीं हूं लेकिन ऐसा लगता है कि आपको इसे url के रूप में भेजने से पहले अपनी बेस 64 स्ट्रिंग को एनकोड करना होगा।

+1

उसके पास यूआरएल का नियंत्रण नहीं है - उसका प्रश्न देखें। 23 sep. 082008-09-23 21:36:24


0

क्या आप बस एक स्पेस ए + नहीं ले सकते हैं और इसे प्रतिस्थापित कर सकते हैं?

Request.QueryString["VLTrap"].Replace(" ", "+"); 

;)


1

ठीक है, जाहिर है आप Base64 स्ट्रिंग यह सर्वर को भेजने से पहले urlencoded होना चाहिए।
यदि आप इसे पूरा नहीं कर पा रहे हैं, तो मैं सुझाव दूंगा कि किसी भी एम्बेडेड रिक्त स्थान को वापस + पर बदल दें; के बाद से b64 तार रिक्त स्थान है, इसकी एक वैध रणनीति ...

  0

"ठीक है, जाहिर है कि आपको सर्वर पर भेजने से पहले बेस 64 स्ट्रिंग URLEncoded होना चाहिए" .... उन्होंने कहा कि उसके उस पर कोई नियंत्रण नहीं है। 23 sep. 082008-09-23 21:43:03

  0

इसलिए जाहिर है ... और वैकल्पिक बाद में। 23 sep. 082008-09-23 23:06:10


1

System.Web.HttpUtility.UrlEncode(yourString) चाल करेगा।


1

एक त्वरित हैक के रूप में आप बेस 64-डीकोडिंग से पहले प्लस कैरेक्टर के साथ स्पेस को प्रतिस्थापित कर सकते हैं।


14

सुझाव दिया समाधान:

Request.QueryString["VLTrap"].Replace(" ", "+"); 

ठीक काम करना चाहिए। आपकी चिंता के लिए:

मुझे इसके बारे में था लेकिन इसके साथ मेरी चिंता थी, और मुझे यह शुरू करने के लिए इसका उल्लेख करना चाहिए था, क्या मुझे नहीं पता कि प्लस साइन के अलावा अन्य पात्रों को विकृत किया जा सकता है ।

reading about base64 द्वारा इसे कम करना आसान है। आधुनिक बेस 64 में कानूनी हैं जो एकमात्र गैर अल्फान्यूमेरिक वर्ण हैं "/", "+" और "=" (जिसका उपयोग केवल पैडिंग के लिए किया जाता है)।

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

तो मुझे लगता है कि आपको ठीक होना चाहिए।


4

मुझे यह वही समस्या है, सिवाय इसके कि मेरे पास मेरे यूआरएल पर नियंत्रण है। Server.URLDecode और Server.URLEncode के साथ भी तो उसे फिर से + हस्ताक्षर करने के लिए कनवर्ट नहीं है, भले ही मेरी क्वेरी स्ट्रिंग के रूप में निम्नानुसार है:

 
http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d 

जब मैं निम्नलिखित प्रदर्शन करते हैं।

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]); 

यह अभी भी एक + संकेत में वापस %2b नहीं बदलता। इसके बजाय मुझे निम्नलिखित करना है:

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]); 
tokenID = tokenID.Replace(" ", "+"); 

फिर यह सही तरीके से काम करता है। वास्तव में अजीब

+5

मुझे बिल्कुल वही समस्या थी। ऐसा लगता है कि 'Request.QueryString ["टोकनआईडी"] 'पहले से ही URLdecoded स्ट्रिंग देता है। इसे सर्वर से गुजरकर। यूआरएलडीकोड आप दो बार urldecoding कर रहे हैं। 11 jan. 122012-01-11 19:55:17


2

मुझे ऐसे पैरामीटर के साथ समान समस्या थी जिसमें बेस 64 मान और जब यह '+' के साथ आता है। केवल अनुरोध .QueryString ["VLTrap"]। बदलें ("", "+"); मेरे लिए ठीक काम किया; कोई UrlEncode या अन्य एन्कोडिंग सहायता नहीं है क्योंकि यहां तक ​​कि यदि आप '% 2b' के रूप में एन्कोड किए गए '+' के साथ पृष्ठ पर एन्कोड किए गए लिंक को दिखाते हैं, तो यह ब्राउज़र है जो इसे पहली बार '+' में बदलता है जब यह दिखाता है और जब आप इसे क्लिक करते हैं तो ब्राउज़र इसे खाली जगह में बदल देता है। इसलिए इसे मूल पोस्टर के रूप में नियंत्रित करने का कोई तरीका नहीं है, भले ही आप स्वयं लिंक दिखाएं। एचटीएमएल ईमेल में भी ऐसे लिंक के साथ एक ही बात।


1

यदि आप System.Uri.UnescapeDataString(yourString) का उपयोग करते हैं तो यह + को अनदेखा कर देगा। इस विधि का उपयोग केवल आपके जैसे मामलों में किया जाना चाहिए, जहां स्ट्रिंग को क्लाइंट या सर्वर पर किसी प्रकार के विरासत दृष्टिकोण का उपयोग करके एन्कोड किया गया था। , http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx