script 앞뒤로 특수문자가 오는경우 (XSS)
- ‘, “의 앞뒤로 구조체 관련 특수문자가 오는 경우는 XSS적용하지 않음.
/**
* @param value
*/
private String replaceScriptForXss(final String value) {
StringBuilder builder = new StringBuilder(value);
Pattern p = Pattern.compile("(?i)" + "script"); // 정규표현식 사용
Matcher m = p.matcher(value);
int pos = 0;
while (m.find(pos)) {
pos = m.start(); // <- str_to_find의 시작 index 리턴
m.end(); // <- str_to_find의 끝 index 리턴
if (m.start() - 1 >= 0 && m.end() + 1 <= builder.length()) {
String temp = builder.substring(m.start() - 1, m.end() + 1);
if (!temp.matches("^[a-zA-Z0-9]*$")) {
builder = builder.replace(m.start(), m.end(), " ");
}
}
m = p.matcher(builder.toString());
pos++;
}
return builder.toString();
}
/**
* @param value
*/
private String replaceQuotForXss(final String value, final String quot) {
StringBuilder builder = new StringBuilder(value);
int pos = builder.indexOf(quot);
while (pos > -1) {
if (pos - 1 >= 0 && pos + 2 <= builder.length()) {
String temp = builder.substring(pos - 1, pos + 2);
if (!StringUtils.containsAny(temp, new char[] { '{', '}', ':', ',', '[', ']' })) {
if (temp.contains("\\" + quot)) {
builder = builder.replace(pos - 1, pos + 1, """);
} else {
builder = builder.replace(pos, pos + 1, """);
}
}
}
pos = builder.indexOf(quot, pos + 1);
}
return builder.toString();
}
최근 댓글