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;
}

}


+ Recent posts