Xss custom filter (lucy 적용 안되어 임시방편 코드)


유지보수 프로젝트 수행 중 취약점 처리 요청이 들어와서 확인해보니 xss 필터 사용이 안되고 있었다.
lucy 필터가 쉽게 적용이 되어 lucy 필터를 적용 하려고 했으나 레거시 소스 + 특이사항 등.. 문제점이 있어서 정부에서 제공한 취약점 가이드에서 예외 처리 해야할 스크립트 동작 코드만 replace 처리 되도록 필터를 만들었다.

  • 아래 코드는 취약점 가이드에 표시되는 모든 스크립트 코드임 ( <, >, style 등.. 몇가지는 제외시킴 )
  • 해외에서 사용하는 Jsoup.clean() 을 사용하려고 코드를 넣었으나.. 혹시모를 레거시 코드 사이드이펙트를 우려하여 스크립트 코드만 처리함
public class XssEscape {

private static List<String> targetList = Arrays.asList(
"javascript", "script", "iframe", "document", "vbscript", "applet",
"embed", "object", "frame", "grameset", "layer", "bgsound",
"alert", "onblur", "onchange", "onclick", "ondblclick", "enerror",
"onfocus", "onload", "onmouse", "expression", "meta", "xml",
"onreset", "onmove", "onstop", "eval", "cookie", "onstart",
"onresize", "onmousewheel", "ondataavailable",
"onafterprint", "onafterupdate", "onmousedown",
"onbeforeactivate", "onbeforecopy", "ondatasetchanged",
"onbeforedeactivate", "onbeforeeditfocus", "onbeforepaste",
"onbeforeprint", "onbeforeunload", "onbeforeupdate",
"onpropertychange", "ondatasetcomplete", "oncellchange",
"onlayoutcomplete", "onmousemove", "oncontextmenu",
"oncontrolselect", "onreadystatechange", "onselectionchange",
"onrowsinserted", "onactivae", "oncopy", "oncut", "onbeforecut", "ondeactivate",
"ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart",
"ondrop", "onerror", "onerrorupdate", "onfilterchange", "onfinish", "onresizestart",
"onunload", "onselectstart", "onfocusin", "onfocusout", "onhelp", "onkeydown",
"onkeypress", "onkeyup", "onrowsdelete", "onlosecapture", "onbounce", "onmouseenter",
"onmouseleave", "onbefore", "onmouseout", "onmouseover", "onmouseup", "onresizeend",
"onabort", "onmoveend", "onmovestart", "onrowenter", "onsubmit"
);

public static String replaceValue(String str) {

String safeDoc = str;

if (StringUtils.isNotEmpty(str)) {
safeDoc = Jsoup.clean(str, Whitelist.relaxed().addTags("address"));
}

return safeDoc;
}

public static String replaceParam(String str) {

String returnStr = str;

if (StringUtils.isNotEmpty(str)) {

String str_low = str.toLowerCase();

for (String target : targetList) {
if (str_low.contains(target)) {
str = str.replaceAll(target, "");
returnStr = str;
}
}
}

return returnStr;
}

}


springboot 에서 jsp-config include 사용


spring의 web.xml에 설정되어 있는 전역 사용 jspf파일을 springboot java 코드로 변환하는 방법

기존코드

<jsp-config>
    <jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<include-prelude>/WEB-INF/views/common/layout/taglib/comTaglibs.jspf</include-prelude>
</jsp-property-group>
</jsp-config>


변경코드

import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.Context;
import org.apache.tomcat.util.descriptor.web.JspConfigDescriptorImpl;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroup;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroupDescriptorImpl;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Collections;

@Component
@Slf4j
public class ServletInitailizer extends SpringBootServletInitializer {

@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory ( ) {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
super.postProcessContext(context);
JspPropertyGroup jspPropertyGroup = new JspPropertyGroup();
jspPropertyGroup.addUrlPattern("*.jsp");
jspPropertyGroup.addUrlPattern("*.jspf");
jspPropertyGroup.setPageEncoding("UTF-8");
jspPropertyGroup.setScriptingInvalid("true");
jspPropertyGroup.addIncludePrelude("/WEB-INF/views/common/layout/taglib/comTaglibs.jspf");
jspPropertyGroup.setTrimWhitespace("true");
jspPropertyGroup.setDefaultContentType("text/html");
JspPropertyGroupDescriptorImpl jspPropertyGroupDescriptor = new JspPropertyGroupDescriptorImpl(jspPropertyGroup);
context.setJspConfigDescriptor(new JspConfigDescriptorImpl(Collections.singletonList(jspPropertyGroupDescriptor), Collections.emptyList()));
}
};
}
}


 

 

DB연결에러 ORA-03120: two-task conversion routine: integer overflow

 

sqldeveloper 사용 시 위와 같은 에러가 발생 하는 원인은 sqldeveloper 툴과 ojdbc 버전이 안맞아서 발생한다.

DBeaver 와 같은 다른 툴을 사용시와 각각 에러 보완 내용은 아래와 같다.

 

** 로컬에 ojdbc 버전별 다운로드 필요하며, 저의 경우에는 oracle 11g 연결 시 발생하였으므로 ojdbc6이 필요하였습니다.

ojdbc5.jar
다운로드
ojdbc6.jar
다운로드
ojdbc7.jar
다운로드
ojdbc8.jar
다운로드
ojdbc14.jar
다운로드

 

  • DBeaver
    1. 연결된 DB 우클릭 [Edit connection] 혹은 연결 세팅 화면에서 우측하단 [Edit Driver Settings] 을 선택
    2. Edit Driver 화면에서 [Add File] 선택 후 로컬에 다운받은 ojdbc 파일을 모두 추가한다
    3. 추가 후 재 연결 시도 시 정상적으로 연결이 수행 된다.
 
  • sqldeveloper
    1. sqldeveloper의 경우 현재 다운받을수 있는 18.x.x ~ 19.x.x 버전의 경우 jdk1.8 과 ojdbc8을 사용한다.
    2. oracle 홈페이지에서 oracle 11g 버전을 다운로드 한다. -> https://www.oracle.com/database/technologies/112010-win64soft.html
    3. jdk 1.6 (jdk-6u45) 파일을 다운 후 설치한다.
    4. 오라클 다운 후 설치 시 '데이터베이스 소프트웨어만 설치' 를 선택하면 DB 관련 툴만 설치가 가능하다.
    5. 설치 후 sqldeveloper PATH는 다음과 같음(대부분..) -> C:\ORACLE\virtual\product\11.2.0\dbhome_1\sqldeveloper
    6. sqldeveloper의 jdk.conf 위치로 이동한다.  -> C:\ORACLE\virtual\product\11.2.0\dbhome_2\sqldeveloper\ide\bin
    7. jdk.conf 파일 맨아래 다음과 같이 입력한다.  -> SetJavaHome C:\Program Files (x86)\Java\jdk1.6.0_45
    8. sqldeveloper을 다시 실행 후 oracle 11g 사용하는 원격지 연결 시 에러없이 정상 연결 된다.

 

+ Recent posts