Iterator 돌려 parameterValues 모든 param검사 후 XSS필터 적용하기
운영중인 서비스의 모든 parameter에 XSS를 적용해야 하는 상황이어서 아래와 같이 상황에 따라
적용을 달리하는 parameter를 나누어 적용하였다.
Iterator를 이용하여 구조체 안 구조체까지 검사하나, 세단계까지는 가지 못한다.
나중에 재귀하여 풀도록 구조를 변경 해봐야겠다.
Logger log = Logger.getLogger(this.getClass());
String[] noXssParam = { "pass", "xml", "msg", "data", "login", "userid", "html", "param", "adminipin" };
String[] noXssQuotParam = { "email", "file", "contents", "cnt", "addr", "url", "target", "info", "link", "titl", "cont", "search", "subject", "txt", "path", "name", "mob", "phone", "info", "expl",
"tel", "key", "img", "array", "value", "text", "datepicker", "frdy", "tody" };
@Override
public String[] getParameterValues(final String parameter) {
String[] values = super.getParameterValues(parameter);
if (values == null) {
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
JSONObject json = new JSONObject();
try {
if (values[i].startsWith("{")) {
json = JSONObject.fromObject(values[i]);
Iterator keyItor = json.keySet().iterator();
while (keyItor.hasNext()) {
String key = keyItor.next().toString();
if (json.getString(key).startsWith("{")) {
JSONObject json2 = JSONObject.fromObject(json.getString(key));
Iterator keyItor2 = json2.keySet().iterator();
while (keyItor2.hasNext()) {
String key2 = keyItor2.next().toString();
json2.put(key2, this.noXss(key2, json2.getString(key2)));
}
json.put(key, json2.toString());
} else {
json.put(key, this.noXss(key, json.getString(key)));
}
}
values[i] = json.toString();
}
} catch (Exception e) {
this.log.error("RequestWrapper.getParameterValues 오류" + e.getMessage());
}
encodedValues[i] = values[i];
// System.out.println("getParameterValues in RequestWrapper : " + values[i] + " ||||| " + parameter);
}
// for (int i = 0; i < encodedValues.length; i++) {
// this.log.info("아웃:" + encodedValues[i]);
// }
return encodedValues;
}
@Override
public String getParameter(final String parameter) {
String value = super.getParameter(parameter);
if (value == null) {
return null;
}
if (StringUtils.isNotEmpty(parameter)) {
Iterator noXssit = Arrays.asList(this.noXssParam).iterator();
Iterator noXssQuotit = Arrays.asList(this.noXssQuotParam).iterator();
while (noXssit.hasNext()) {
if (parameter.toLowerCase().indexOf(noXssit.next().toString()) > -1) {
return value;
}
}
while (noXssQuotit.hasNext()) {
if (parameter.toLowerCase().indexOf(noXssQuotit.next().toString()) > -1) {
return CommonUtil.restoreQuotAfterXss(value);
}
}
}
// System.out.println("getParameter in RequestWrapper : " + value + " ||||| " + parameter);
return this.cleanXSS(value);
}
최근 댓글