Это темный угол сервлета спецификации, которая не определена (и имеет 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