크로스사이트스크립팅이라는 사이트해킹기법은 사용자의 뷰에서 스크립트코드를 전송시켜 시스템을 해킹하는 방법을 말합니다.
<script> 로 시작하는 코드를 전송시켜 아래 해당 내용을 서버에서 실행시키는 방법이죠. HTML에서는 정규식이라는 방법으로 [<] 와 같은 기호들은 [ < ] 와 같은 코드로 변환시켜 서블릿전송을 합니다.
그런데 호출되는 메서드에서 공통코드 변환 치환자를 대입하려면 작업이 만만치 않습니다. 따라서 필터를 사용해서 .do 를 호출하는 경우 강제로 필터를 거치게 만들어 빠르고 쉽게 크로스사이트스크립팅 방지를 할 수 있습니다.
전자정부프레임워크에서는 이러한 정규식처리를 보다 쉽고 편하게 처리하기 위해 HTMLTagFilter 클래스를 구현하여 정규식변환처리를 하고 있어서 프로젝트 개발시 참고하기에 좋기에 소개를 해 드립니다.
필터를 사용하기 위해서는 web.xml에 필터선언 부분을 추가합니다.
web.xml
<filter>
<filter-name>HTMLTagFilter</filter-name>
<filter-class>infrastructure.web.servlet.filter</filter-class>
</filter>
<filter-mapping>
<filter-name>HTMLTagFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
.do 로 호출되는 모든 URL은 필터를 거치게 되며 필터에서 정규식변환처리가 일어납니다. infrastructure.web.servlet.filter 는 현재 구성된 필터의 위치이며 사용하시는 패키지위치에 맞춰서 바꿔주셔야 됩니다.
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 infrastructure.web.servlet.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{
private FilterConfig config;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new HTMLTagFilterRequestWrapper((HttpServletRequest)request), response);
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
HTMLTagFiler에서는 HTMLTagFilterRequestWrapper 객체를 호출해서 사용하고 있는 구현 클래스입니다.
HTMLTagFilterRequestWrapper.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 infrastructure.web.servlet.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class HTMLTagFilterRequestWrapper extends HttpServletRequestWrapper {
public HTMLTagFilterRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
if(value==null){
return null;
}
StringBuffer strBuff = new StringBuffer();
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
switch (c) {
case '<':
strBuff.append("<");
break;
case '>':
strBuff.append(">");
break;
case '&':
strBuff.append("&");
break;
case '"':
strBuff.append(""");
break;
case '\'':
strBuff.append("'");
break;
default:
strBuff.append(c);
break;
}
}
value = strBuff.toString();
return value;
}
@Override
public String[] getParameterValues(String parameter) {
String[] values = super.getParameterValues(parameter);
if(values==null){
return null;
}
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
StringBuffer strBuff = new StringBuffer();
for (int j = 0; j < values[i].length(); j++) {
char c = values[i].charAt(j);
switch (c) {
case '<':
strBuff.append("<");
break;
case '>':
strBuff.append(">");
break;
case '&':
strBuff.append("&");
break;
case '"':
strBuff.append(""");
break;
case '\'':
strBuff.append("'");
break;
default:
strBuff.append(c);
break;
}
}
values[i] = strBuff.toString();
} else {
values[i] = null;
}
}
return values;
}
}
실제적으로 정규식변환처리를 하는 클래스입니다.
이렇게 web.xml과 필터클래스 두개만 추가하면 아주쉽게 크로스크로스스크립팅을 방지할 수 있습니다.
혹시 정규식 변환에 문제가 생기면(URL 파라미터값에 특수문자가 꼭 필요한경우) 해당 메서드만 예외처리를 하는 방법도 있겠네요.
'IT정보센터' 카테고리의 다른 글
아미나빌더의 업데이트 종료 그리고 나리야빌더 (0) | 2020.09.07 |
---|---|
IOS 13 업데이트가 기대되는 이유 (0) | 2019.06.05 |
앞으로의 애플 행보 추측 아이폰의 미래 (0) | 2019.05.27 |
파이어폭스 퀀텀 출시 안내 (0) | 2017.11.27 |
유튜브 동영상 사이즈 반응형으로 적용시키기 (0) | 2017.11.02 |
아이피타임 as 경험해보다 (0) | 2017.07.26 |
비트코인의 가치, 미래 (0) | 2017.06.18 |
무료도메인 등록 손쉽게하기 (0) | 2017.06.05 |
svn 오류 is a already a working copy fot a different URL 해결방법 (0) | 2017.02.23 |
프록시란 무엇일까요? 이용방법 알아보겠습니다. (0) | 2016.04.17 |