자바(Java) & 인텔리제이

[문제해결]XSS filter(lucy-xss-servlet) 적용 후 파일 업로드 안되는 현상

아과노트 2024. 7. 17. 10:54
728x90
반응형

안녕하세요, 

 

최근에 취약점 점검때문에 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년전의 글에서 힌트를 얻어서 문제해결을 했습니다.

 

앞서 답변주신 분께 너무나 감사드립니다.

 

오늘은 여기까지 입니다.

 

다른분들은 삽질이 줄어들길....

728x90
반응형