개발자의 끄적끄적

[java] 전자정부프레임워크 크로스 사이트 스크립팅(XSS)과 HTMLTagFilter [펌] 본문

개발/java & jsp

[java] 전자정부프레임워크 크로스 사이트 스크립팅(XSS)과 HTMLTagFilter [펌]

효벨 2020. 5. 18. 09:41
728x90
반응형

[java] 전자정부프레임워크 크로스 사이트 스크립팅(XSS)과 HTMLTagFilter [펌]

 

크로스 사이트 스크립팅(XSS)

Cross Site Scripting

 

  • 스크립트를 악용해 사용자를 공격하는 기법.
  • SQL Injection과 더불어 가장 자주 사용되는 해킹기법이다.
  • 파라미터에 를 입력하여 다른 사용자에게 피해를 주게 한다.

 


HTMLTagFilter

전자정부프레임워크에서 제공하는 HTMLTagFilter 클래스를 구현하여 보다 간편하게 XSS 공격을 방어할 수 있다.

 

web.xml 에 다음을 추가하면 된다.

<filter>
    <filter-name>HTMLTagFilter</filter-name>
    <filter-class>egovframework.com.cmm.filter.HTMLTagFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HTMLTagFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

egovframework.com.cmm.filter.HTMLTagFilter

이 부분은 HTMLTagFilter 클래스가 있는 패키지 주소를 입력한다.

 

Filter는 기본적으로 <url-pattern>을 통해 Filter의 적용 범위를 결정한다.

위의 예시는 .do 로 끝나는 모든 url을 필터링하게 되어있다.

 

Filter는 예외(Exclude)를 지정하는 곳이 따로 없기 때문에 메서드를 따로 구현해야 한다.

참고 : Filter는 전체적인 url을 처리하기 때문에 예외가 없다고 한다.

(Interceptor는 특청 url 요청을 처리하기 위해 사용)

 

먼저 전자정부프레임워크에서 제공하는 HTMLTagFilter.java 클래스이다.

HTMLTagFilter.java

 

HTMLTagFilter.java

/*
 * Copyright 2008-2009 MOPAS(MINISTRY OF SECURITY AND PUBLIC ADMINISTRATION).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package egovframework.com.cmm.filter;
​
import java.io.IOException;
​
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
​
public class HTMLTagFilter implements Filter{
​
    @SuppressWarnings("unused")
    private FilterConfig config;

    //2. 실제 Filter 작업을 실행하는 구간
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {


        chain.doFilter(new HTMLTagFilterRequestWrapper((HttpServletRequest)request),                            response);
    }

    //1. Filter 인스턴스 시작
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
​
    //3. Filter 인스턴스 종료
    public void destroy() {
​
    }
}

다른 블로그를 참고하여 /biz/로 시작하는 url은 filter 작업을 거치지 않도록 분기 처리를 위한 checkUrl 매서드를 만들고 doFilter 매서드를 수정하였다.

package egovframework.com.cmm.filter;
​
import java.io.IOException;
​
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
​
public class HTMLTagFilter implements Filter{
​
    @SuppressWarnings("unused")
    private FilterConfig config;
​
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;

        if(checkUrl(req)){
            // /biz/로 시작하는 url은 filter를 하지 않는다.
            chain.doFilter(request, response);
        }
        else {
            //그 외의 경우 filter를 한다.
            chain.doFilter(new HTMLTagFilterRequestWrapper((HttpServletRequest)request),            response);
        }

    }
​
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
​
    public void destroy() {
​
    }

    // "/biz/"로 시작하는 url인지 확인하는 method
    private boolean checkUrl(HttpServletRequest req) {
        String uri = req.getRequestURI().toString().trim();
        if(uri.startsWith("/biz/")){
            return true;
        }
        else {
            return false;
        }
    }
}

참고 및 출처 : https://jwchoi85.tistory.com/87

 

 

출처 : https://kanghw.tistory.com/15

 

반응형
Comments