كيفية الحصول على QueryString عندما يكون urlencoded أو لديه أحرف في المئة في ASP.NET

StackOverflow https://stackoverflow.com/questions/1638499

سؤال

كيفية الحصول على QueryString الفعلي من كائن الطلب عندما يكون QueryString urlencoded أو لديه أحرف في المئة في ASP.NET؟

بشكل أساسي ، إذا كان لدي عنوان URL مثل هذا: Default.aspx?p=%b4, ، كيف يمكنني الحصول على سلسلة ملخمة مع "٪ B4"؟

Request.QueryString["p"] إرجاع شخصية غير قابلة للطباعة.

Request.RawUrl إرجاع default.aspx؟ p = ٪ UFFFD "

Request.Url.AbsoluteUri إرجاع default.aspx؟ p = ٪ EF ٪ BF ٪ BD

كيف يمكنني استعادة "٪ B4"؟

هل كانت مفيدة؟

المحلول

لقد حفرت في هذا الأمر أبعد من ذلك ، وأعتقد أنني أعرف سبب هذا: يقوم عميل HTTP بإرسال عنوان URL إلى الخادم الذي لا يرفض عناوين URL بشكل صحيح. على وجه التحديد ، هناك حرف غير صالح في عنوان URL.

لإعادة الصق ، قم بصق ما يلي في نهاية عنوان URL الخاص بك إلى IE8: default.aspx?p=´

إذا قمت بفحص البايتات التي تتجاوز السلك (على سبيل المثال ، استخدم العابث) ، سترى حرف HEX B4 الفعلي يتم إرساله من عميل إلى خادم في عنوان URL. هذه شخصية غير قانونية في عنوان URL ، حيث أن عناوين URL تقتصر على رموز char تحت 0x80 (يجب أن تكون أي رموز char أكبر من 0x80 مئوية).

لذا فإن عميلك يمر في حرف غير صالح ، ويتم استبدال الخادم الخاص بك (بشكل صحيح) حرف استبدال Unicode (U+0FFD), ، وهو ما يحدث عند مواجهة شخصية لا يعادلها في الترميز المحلي.

Afaik ، هذا خطأ في IE. إذا قمت بكتابة عنوان URL نفسه في Firefox ، فسيقوم Firefox بتشفير عنوان URL بشكل صحيح (مثل ٪ B4 بدلاً من ´). لاحظ أنه ، أيضًا ، لا تحدث المشكلة إلا عند لصق أحرف غير صالحة يدويًا في شريط عناوين IE- إذا كان نفس الحرف موجودًا في رابط ، يبدو أنه يشفر عنوان URL بشكل صحيح (على الأقل في الحالات التي اختبرتها).

لذلك يجب عليك معرفة من الذي يرسل عنوان URL هذا المزيج لك ، وتطلب منهم البدء في ترميز عناوين URL الخاصة بهم بشكل صحيح!

نصائح أخرى

ستقوم ASP.NET تلقائيًا بفك تشفير URL عندما تقوم بـ request.quareString ["KEY"]. تحتاج فقط إلى تشفيره مرة أخرى.

HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

سيعود سلسلة الاستعلام الخام

كان لي نفس المشكلة. لقد قمت بحلها فقط عن طريق إضافة JavaScript "Escape ('text ٪ text')" أثناء تناقض QueryString!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top