Spring MVC-приложение, фильтрующее HTML в URL-адресе - это проблема безопасности?
Мое существующее приложение Spring Web MVC имеет следующее отображение обработчика в контроллере.
@RequestMapping(method = RequestMethod.GET, value = "/welcome")
Я запускаю следующий запрос http://www.example.com/welcome
, и это отлично работает.
Проблема
http://www.example.com/welcome.check.blah
также работает!!!
Кроме того, URL-адрес запроса HTTP GET для приложения с тегом script становится повторно отображаемым, хотя он не выполняет авторизацию.
Пример http://www.example.com/welcome<script>alert("hi")</script>
отображается повторно как таковой в окне браузера, и в результате моей логики авторизации отображается сообщение "Не авторизованное".
Интересно, является ли это проблемой безопасности и нужно ли мне кодировать/фильтровать код?
Ответы
Ответ 1
Это связано с опцией useSuffixPatternMatch
, которая по умолчанию является истиной внутри RequestMappingHandlerMapping
(я предполагаю, что вы используете Spring MVC 3.1).
useSuffixPatternMatch:Использовать ли совпадение шаблона ( ". *" ) При сопоставлении шаблонов с запросами. Если включено, то метод, сопоставленный с "/users", также соответствует "/users.*". Значение по умолчанию - "true".
Чтобы установить useSuffixPatternMatch
в false, самый простой способ - использовать @Configuration
:
@Configuration
@EnableWebMvc
public class Api extends WebMvcConfigurationSupport {
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = super.requestMappingHandlerMapping();
mapping.setUseSuffixPatternMatch(false);
return mapping;
}
}
Ответ 2
В текущей конфигурации Spring Java есть несколько более простой способ настроить одно и то же:
@Configuration
public class DispatcherConfig extends WebMvcConfigurationSupport {
@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
}
Ответ 3
Когда вы используете Spring для запроса сопоставления этого типа (т.е. "/ничего" ) Spring фактически отображает ваш контроллер на несколько URL-адресов:
/приветствовать
/welcome.*
/Добро пожаловать /
Чтобы предотвратить это - будь то более конкретным при запросе (например,/welcome.htm) или вручную сопоставьте URL-адрес контроллера в конфигурации Xml:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/welcome">YourControllerBean</prop>
</props>
</property>
</bean>
Приветствия, Пит
Ответ 4
Вы также можете ограничить это в web.xml, указав шаблон url. Вместо того, чтобы давать "/", вы можете указать "/.htm" в своем web.xml.
Что-то вроде
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/application/*.htm</url-pattern>
</servlet-mapping>
Ответ 5
Вы можете использовать свойство useDefaultSuffixPattern.
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
Также ссылайтесь на Ограничение шаблона URL в SPRING MVC