크로스 사이트 스크립팅(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
x/*
* 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{
("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 매서드를 수정하였다.
xxxxxxxxxx
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{
("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