본문 바로가기
programming language/Java

HTMLTagFilterRequestWrapper를 이용한 HTMLTagFilter 적용하기

by Lcoding 2024. 7. 19.
반응형

흔히 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에서 허용된 태그만을 제외하고 나머지를 필터링하여, 보안 문제를 방지할 수 있습니다. 필터링 로직은 프로젝트의 요구사항 및 상황에 맞게 추가적으로 수정할 수 있습니다.

 

 

감사합니다.

 

 

 

반응형

loading