흔히 XSS라 불리는 Cross Site Scripting을 방지하기 위하여 HTMLTagFilter를 적용하게됩니다.
HTMLTagFilterRequestWrapper와 HTMLTagFilter는 주로 웹 애플리케이션에서 사용자가 입력한 HTML에서,
허용해놓은 태그만 허용하고 나머지 태그는 필터링하여 보안 문제를 방지하기 위해 사용됩니다.
예를 들어, 사용자가 입력한 내용을 웹 페이지에 표시할 때 <script>,<onload>,<onmouseover>등의 태그와 같은 위험한 HTML 태그가 포함되지 않도록 하기 위함입니다.
1. HTMLTagFilterRequestWrapper 클래스 생성:
HttpServletRequestWrapper를 확장하여 사용자가 입력한 HTML을 필터링하는 역할을 합니다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class HTMLTagFilterRequestWrapper extends HttpServletRequestWrapper {
public HTMLTagFilterRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String[] getParameterValues(String parameter) {
// 원본 입력 값 가져오기
String[] values = super.getParameterValues(parameter);
if (values == null) {
return null;
}
// 각 입력 값에 대해 HTML 필터링 적용
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = filterHTML(values[i]);
}
return encodedValues;
}
private String filterHTML(String input) {
// 여기서는 간단히 허용할 HTML 태그를 지정하거나 특수 문자를 이스케이프할 수 있습니다.
// 예를 들어, Jsoup 라이브러리를 사용하여 특정 태그를 허용하거나 제거할 수도 있습니다.
// 실제 필터링 방법은 해당 프로젝트의 요구사항과 보안 정책에 따라 달라질 수 있으며,
// 아래 금지 시킬 태그를 replace항목에 추가해주면 됩니다.
// HTML 태그 허용 목록 (여기서는 <b>, <i> 태그만 허용)
return input.replaceAll("<(?!/?(b|i)\\b)[^>]*>", "");
//return input.replaceAll("<onload>", "<no_onload>");
// 이런식으로 변경 시켜버릴수도있으나, 변경시키지 않는 경우도 잘 생각하여야한다.
}
}
위 코드와 같이 filterHTML 메서드는 간단한 정규식을 사용하여 <b>와 <i> 태그를 제외한 모든 HTML 태그를 제거하며, 바로 아래 주석과 같이 특정 태그를 지목해서 다른 값으로 치환도 가능합니다, 실제로는 보다 복잡한 HTML 필터링 라이브러리를 사용하는 것이 좋습니다.
2. Filter 설정: 서블릿 필터를 설정하여 HTMLTagFilterRequestWrapper를 적용합니다.
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class HTMLTagFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 코드
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HTMLTagFilterRequestWrapper wrappedRequest = new HTMLTagFilterRequestWrapper(httpRequest);
chain.doFilter(wrappedRequest, response);
}
@Override
public void destroy() {
// 필터 종료 시 처리할 코드
}
}
위 코드에서는 모든 요청("/*")에 대해 HTMLTagFilterRequestWrapper를 적용하는 서블릿 필터를 정의합니다.
이러한 필터 설정을 통해 모든 사용자 입력이 필터링되어 원치 않는 HTML 태그가 포함되지 않도록 할 수 있습니다.
3. 웹 애플리케이션 설정:
필터를 웹 애플리케이션의 web.xml 파일이나 애너테이션을 통해 등록하여 사용합니다.
web.xml 방식 -
<!-- web.xml에 필터 등록하는 예시 -->
<filter>
<filter-name>HTMLTagFilter</filter-name>
<filter-class>com.example.filter.HTMLTagFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HTMLTagFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
애너테이션 방식 -
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
@WebFilter(filterName = "HTMLTagFilter", urlPatterns = "/*", initParams = {
@WebInitParam(name = "paramName", value = "paramValue")
})
public class HTMLTagFilter implements Filter {
// 필터 구현 코드는 위의 예시와 같습니다.
}
이렇게 구현된 필터는 사용자가 입력한 HTML에서 허용된 태그만을 제외하고 나머지를 필터링하여, 보안 문제를 방지할 수 있습니다. 필터링 로직은 프로젝트의 요구사항 및 상황에 맞게 추가적으로 수정할 수 있습니다.
감사합니다.
'programming language > Java' 카테고리의 다른 글
Java_ 엑셀 파일 시트별로 병합하기 (2) | 2024.11.18 |
---|---|
보안) FileUtils를 이용한 업로드 확장자를 제한하는 방법 (0) | 2024.07.23 |
람다문이란? (0) | 2024.01.27 |
인터페이스와 추상클래스의 차이점은?? (1) | 2023.12.05 |
forEachRemaining() 메서드와 for문의 성능차이는? (1) | 2023.11.25 |