تم تشكيل سلسلة الاستعلام بشكل غير صحيح بعد URLDecode

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

  •  02-07-2019
  •  | 
  •  

سؤال

أحاول تمرير سلسلة Base64 إلى تطبيق ويب 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(" ", "+");

لقد فكرت في هذا ولكن ما يقلقني، وكان يجب أن أذكر هذا في البداية، هو أنني لا أعرف ما هو آخر قد تكون الأحرف مشوهة بالإضافة إلى علامة الجمع.

هدفي الرئيسي هو اعتراض QueryString قبل تشغيله من خلال وحدة فك الترميز.

ولتحقيق هذه الغاية حاولت النظر إلى Request.QueryString.toString() ولكن هذا يحتوي على نفس المعلومات المشوهة.هل هناك أي طريقة لإلقاء نظرة على QueryString الخام قبل هل تم فك ترميز URL؟

بعد إجراء المزيد من الاختبارات، يبدو أن .Net يتوقع أن يكون كل شيء يأتي من QuerString مشفرًا بعنوان URL ولكن المتصفح لا يقوم تلقائيًا بتشفير عنوان URL لطلبات GET.

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

المحلول

يمكنك استبدال القيمة يدويًا (argument.Replace(' ', '+')) أو استشارة HttpRequest.ServerVariables["QUERY_STRING"] (وأفضل من ذلك HttpRequest.Url.Query) وقم بتحليله بنفسك.

ومع ذلك، يجب عليك محاولة حل المشكلة حيث يتم تقديم عنوان URL؛يجب أن يتم ترميز علامة الجمع كـ "%2B" في عنوان URL لأن علامة الجمع تمثل مسافة.

إذا لم تكن تتحكم في عناوين URL الواردة، فسيتم تفضيل الخيار الأول لأنك تتجنب معظم الأخطاء بهذه الطريقة.

نصائح أخرى

الحل المقترح :

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

يجب أن تعمل على ما يرام.أما عن انشغالك:

لقد فكرت في هذا ولكن ما يقلقني، وكان يجب أن أذكر هذا في البداية، هو أنني لا أعرف ما هي الشخصيات الأخرى التي قد تكون مشوهة بالإضافة إلى علامة الزائد.

وهذا أمر سهل التخفيف منه القراءة عن base64.الأحرف الوحيدة غير الأبجدية الرقمية المسموح بها في Base64 الحديثة هي "/" و"+" و"=" (والتي تُستخدم فقط للحشو).

من بينها، "+" هو الوحيد الذي له معنى خاص كتمثيل مهرب في عناوين URL.في حين أن الاثنين الآخرين لهما معنى خاص في عناوين URL (محدد المسار وفاصل سلسلة الاستعلام)، فلا ينبغي أن يشكلا مشكلة.

لذلك أعتقد أنك يجب أن تكون على ما يرام.

أواجه نفس المشكلة تمامًا باستثناء أنني أتحكم في عنوان URL الخاص بي.حتى مع 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(" ", "+");

ثم يعمل بشكل صحيح.غريب حقا.

واجهت مشكلة مماثلة مع المعلمة التي تحتوي على قيمة Base64 وعندما تأتي مع "+".فقط Request.QueryString["VLTrap"].Replace(" ", "+");عملت بشكل جيد بالنسبة لي.لا يوجد UrlEncode أو أي ترميز آخر يساعد لأنه حتى إذا قمت بإظهار رابط مشفر على الصفحة بنفسك باستخدام "+" مشفر كـ "%2b"، فإن المتصفح هو الذي يغيره إلى "+" في البداية عندما يظهر وعند النقر فوقه يتغير المتصفح إلى مساحة فارغة.لذلك لا توجد طريقة للتحكم فيه كما يقول الملصق الأصلي حتى لو قمت بإظهار الروابط بنفسك.نفس الشيء مع مثل هذه الروابط حتى في رسائل البريد الإلكتروني بتنسيق HTML.

إذا قمت بترميز URL للسلسلة قبل إضافتها إلى عنوان URL، فلن تواجه أيًا من هذه المشكلات (سيعيدها URLDecode التلقائي إلى حالته الأصلية).

حسنًا، من الواضح أنه يجب أن يكون لديك سلسلة Base64 URLEncoded قبل إرسالها إلى الخادم.
إذا لم تتمكن من تحقيق ذلك، أقترح ببساطة استبدال أي مسافات مضمنة مرة أخرى إلى +؛نظرًا لأنه ليس من المفترض أن تحتوي سلاسل b64 على مسافات، فهذا تكتيك مشروع ...

System.Web.HttpUtility.UrlEncode(yourString) سوف تفعل الخدعة.

كاختراق سريع، يمكنك استبدال المسافة بحرف زائد قبل فك تشفير Base64.

إذا كنت تستخدم 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

أنا لست مطورًا لـ C# بأي حال من الأحوال ولكن يبدو أنك بحاجة إلى عنوان url ENCODE لسلسلة Base64 الخاصة بك قبل إرسالها كعنوان url.

ألا يمكنك أن تفترض أن المسافة هي + وتستبدلها؟

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

;)

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