2016-11-24 2 views
0

Привет я обеспечиваю HTTP-сервер с встроенным JettyEmbedded Jetty замена suburl

По некоторым причинам, некоторые запросы должны быть получены с suburl, содержащими точками. Пример: http://127.0.0.1:10000/./test/

Но когда я получаю suburl с причала, точка заменяется автоматически.

Есть ли способ остановить замену?

Благодаря Jae

ответ

0

Это темный угол сервлета спецификации, которая не определена (и имеет had discussion on the servlet spec experts group mailing list, как совсем недавно, 2 месяца назад!)

В спецификации говорит входящие URL-адреса должны быть «нормализованным» перед сопоставлением с contextPath или urlPattern.

Нормализация URI/URL делаются по ряду причин (требования спецификации, безопасности, предотвращение доступа вне контекста, обхода каталога очистки, применяются ограничения правильно, и т.д ..)

Вещи, которые нормализуются (при условии, 3 развернутые контексты на /foo и /bar и /):

  • /foo ->/foo/
  • /foo/../bar/ ->/bar/
  • /foo/../../../etc/passwd ->/etc/passwd
  • /foo/css//main.css ->/foo/css/main.css
  • /foo/app/./css/./widget.css ->/foo/app/css/widget.css

Затем возьмите это чудовище ...

  • /foo/context/.//..%2F..//./%62%61%72/context/servlet/info -> ??

Jetty в настоящее время нормализуется это вплоть до /bar/context/servlet/info, но строгая интерпретация сервлета спецификации (очень непопулярная интерпретация среди сервлета спецификации реализаторов!) Говорит, что он должен:

  • матч на /foo контекст
  • getContextPath() возвращает /foo/context/.//..%2F..//./%62%61%72/context/servlet/info
  • getPathInfo() возвращает /context/.//..%2F..//./%62%61%72/context/servlet/info

Эта уродливая часть спецификации очень враждебна усилиям по обеспечению безопасности и, вероятно, будет уточняться/уточняться в Servlet 4.0

Смежные вопросы