안녕하세요,
최근에 취약점 점검때문에 XSS 필터(filter)를 적용할 일이 있었는데
XSS필터를 직접 구현하려다가 Naver 에서 만들어준 lucy-xss-servlet을 적용하고
난 문제점에 대해서 오늘 포스팅을 해보려고 합니다.
lucy-xss-servlet 을 적용하는것은 어렵지 않는데..
처음에는 문제 없이 잘 동작하는듯 했으나
나중에 보니 파일 업로드시에 MultipartFile로 아무것도 가져오지 못하는것을 확인했습니다.
구글링을 해도 잘 안나오다가
약 9년전에 누군가가 답글을 올려주신 것을 보고 저도 공유드립니다.(감사합니다...)
https://okky.kr/questions/284926
OKKY - xss filter 적용 후 파일업로드가 안됩니다.
안녕하세요.홈페이지에 XSS 취약점이 있어 패치를 하던 도중 난관에 봉착했습니다 ..-_-;네이버에서 제공하는 lucy-xss-servlet을 사용하였습니다.web.xml의 내용은 아래와 같습니다. <filter> <filter-nam
okky.kr
같은 오류를 겪고 있었는데
원인은 필터에서 파일 스트림을 사용해버리기 때문입니다.
그래서 필터를 거치고 난 후에 오는 컨트롤러에서는 사용할 수 없게 됩니다.
* 멀티파트로 전송되는 파일 스트림은 한번만 사용할 수 있습니다.
그래서 다음과 같은 과정으로 셋팅을 추가해야 합니다.
Step 1. XSS 필터 앞에 multipartFilter 추가
<!-- multipartFilter -->
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>xssEscapeServletFilter</filter-name>
<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssEscapeServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Step 2. 톰캣의 Context.xml에 allowCasualMultipartParsing 속성 추가
<Context allowCasualMultipartParsing="true">
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- 케시문제 해결 -->
<Resources cachingAllowed="true" cacheMaxSize="100000"></Resources>
</Context>
Step3. multipartResolver 의 빈(bean)의 ID 변경
<!-- MultipartResolver 설정 -->
<!-- XSS때문에 bean id를 MultipartResolver에서 filterMultipartResolver로 수정. 24.07.16 by alshin-->
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="100000000" />
</bean>
이렇게 하면 마법같이 됩니다.
정말 의외로...
multipartResolver 의 빈(bean)의 ID 변경이 매우 중요합니다.
multipartResolver 의 빈(bean)의 ID 변경이 매우 중요합니다.
by 아과노트
9년전의 글에서 힌트를 얻어서 문제해결을 했습니다.
앞서 답변주신 분께 너무나 감사드립니다.
오늘은 여기까지 입니다.
다른분들은 삽질이 줄어들길....