كيفية الحصول على QueryString عندما يكون urlencoded أو لديه أحرف في المئة في ASP.NET
-
08-07-2019 - |
سؤال
كيفية الحصول على 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!