سؤال

دعونا نفترض أن لدي سلسلة مثل "= &؟ /؛ # +٪" لتكون جزءا من عنوان URL الخاص بي، دعنا نقول مثل هذا:

example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf

حيث myString هو السلسلة المذكورة أعلاه. لقد ترشف الجزء الحرج حتى تبدو URL

example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf

حتى الان جيدة جدا.

عندما أكون في servlet وأقرأ أي من request.getRequestURI(), request.getRequestURL() أو request.getPathInfo(), ، يتم إرجاع القيمة بالفعل، لذلك أحصل على strilng مثل

someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf

ولا أستطيع التمييز بين الشخصيات الخاصة الحقيقية والشفرج.

لقد قمت بحل مشكلة خاصة عن طريق الحظر فوق السحر تماما، والذي يعمل في هذه الحالة، لكن ما زلت أتساءل هو هناك أي طريقة للحصول على عنوان URL غير المعروف في فئة Servlet.

تعديل آخر: عندما أضرب هذه المشكلة، كانت المساء الماضي، كنت متعبا للغاية لإشعار ما الذي يحدث بالفعل، وهو ما هو عليه حتى أكثر غريب! لدي servlet المعين، على سبيل المثال / servletpath / * بعد ذلك يمكنني وضع كل ما أريد والحصول على سللتي استجابة اعتمادا على بقية المسار، إلا عندما يكون هناك٪ 2F في المسار. في هذه الحالة طلب لا يضرب servlet, ، واحصل على 404! إذا وضعت "/" بدلا من٪ 2F، فإنه يعمل موافق. أنا أقوم بتشغيل Tomcat 6.0.14 على Java 1.6.0-04 على Linux.

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

المحلول

هناك فرق أساسي بين "٪ 2F" و "/"، سواء للمتصفح والخادم.

تقول مواصفات httpservletrequest (دون أي منطق، AFAICT):

  • GetContextPath: لا فك شفرة
  • GetPathinfo: فك شفرة
  • تعثر: لا فك شفرة
  • GetqueryString: غير فك
  • GetRequesturi: غير فك
  • GetServletpath: فك شفرة

نتيجة getpathinfo () ينبغي يتم فك تشفيرها، ولكن نتيجة GetRequesturi () لا يجب انزعز. إذا كان ذلك هو، فإن حاوية Servlet الخاصة بك تقطع المواصفات (ك Wouter Coekers و Francois Grave المدورة بشكل صحيح). ما إصدار Tomcat الذي تقوم بتشغيله؟

جعل الأمور أكثر مربكة، وإصدارات Tomcat الحالية التي ترفض المسارات التي تحتوي على ترميزات من أحرف خاصة معينة، لأسباب أمنية.

نصائح أخرى

إذا كان هناك %2F في ال فك شفرة عنوان URL، وهذا يعني مشفرة URL الواردة %252F.

حيث %2F يكون / لماذا لا تقسم فقط "\/" ولا تقلق بشأن ترميز URL؟

بحسب ال جافادوك, ، يجب أن GetRequesturi لا ينبغي فك تشفير السلسلة. من ناحية أخرى، إرجاع GetServletPath سلسلة فكفي. اختبرت هذا محليا باستخدام Jetty ويتصرف كما هو موضح في الوثيقة.

لذلك قد يكون هناك شيء آخر عند اللعب في وضعك لأن السلوك الذي تصفه لا يتطابق مع وثائق الشمس.

يبدو أنك تحاول القيام بشيء رائع (استخدم جيرسي). هل يمكن أن تحليل فقط من الأجزاء الرائدة والخريطة من عنوان URL للحصول على البيانات التي تبحث عنها؟

url.substring (طول startlengh، url.length - endlength)؛

تحديث: كانت هذه الإجابة في الأصل تفيد بشكل خاطئ بأن "/" و "٪ 2F" في المسار يجب أن يعامل دائما. هم في الواقع مختلفة لأن المسار هو قائمة / شرائح محفورة.

يجب ألا تضطر إلى إحداث فرق بين شخصية مشفرة وغير مشفرة فيها الجزء المسار عنوان URL. لا يوجد شخصية داخل المسار الذي يمكن أن يكون له معنى خاص في عنوان URL. على سبيل المثال "٪ 2F" يجب أن تفسر نفس "/"، والمتصفح الذي يصل إلى مثل عنوان URL مجاني لاستبدال واحد من جانب الآخر كما يراه مناسبا. يحدث فرقا بينهما هو كسر مستوى كيفية ترميز عناوين URL.

في عنوان URL الكامل، يجب أن تحدث فرقا بين الأحرف المتفجرة وغير المتفجرة لأسباب مختلفة، بما في ذلك:

  • لمعرفة أين ينتهي جزء المسار. لأن أ؟ لا ينبغي أن ينظر إلى المشفرة في المسار كنهاية.
  • داخل سلسلة الاستعلام. لأن جزءا من قيمة المعلمة يمكن أن يحتوي على '&' أو '='، ...
  • داخل المسار، يفصل "/" فصل شريحين بينما يمكن احتواء "٪ 2F" في قطاع

يتعامل Java بشكل جيد مع أول حالتين:

  • getPathInfo() الذي يعود فقط الجزء المسار، فك شفرة
  • getParameter(String) للوصول إلى أجزاء جزء الاستعلام

لا يتعامل بشكل جيد مع الحالة الثالثة. إذا كنت ترغب في إحداث تغيير بين "/" عند فصل قطاعات مسارين، و "/" داخل شريحة مسار (٪ 2F)، فلا يمكنك تمثيل المسار باستمرار كسلسلة فك شفرة واحدة. يمكنك إما أن تمثلها كسلسلة واحدة مشفرة (مثل "Foo / Bar٪ 2fbaz")، أو كقائمة من قطاعات فك شفرة (مثل "Foo"، "Bar / Baz"). ولكن نظرا لأن GetPathinfo () يعد API بالقيام بذلك (سلسلة فك شفرة واحدة)، ليس لديها خيار سوى علاج "/" و "٪ 2F" كما هو نفسه.

لتطبيقات الويب المعتادة، هذا جيد فقط. إذا كنت في حالة نادرة حيث تحتاج حقا إلى إحداث الفرق، فيمكنك القيام بتحليل URL الخاص بك، والحصول على النسخة الخام مع getRequestURI(). وبعد إذا كان هذا المرء يمنح عنوان URL فكفي كما تقدم، فهذا يعني وجود خطأ في تطبيق Servlet الذي تستخدمه.

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