手上的一个项目最近用appscan扫描测试。遇到了几个中高问题:
看了下测试报告给出的原因:未对用户输入正确执行危险字符清理。
修改建议是针对xss漏洞进行修复。
最开始处理的时候,参照预防XSS攻击,(参数/响应值)特殊字符过滤这篇博文做了过滤,再扫描还是有这几个问题。
后面又看了篇博文XSS攻击常识及常见的XSS攻击脚本汇总,了解到了还有各种变种攻击。
经过多次扫描,发现一个就加一个过滤条件。终于没再报这几个问题了。
下面附上我的过滤条件。
public boolean checkXssAttack(String str) {
String[] regexArr = {"<(\\s)*(no)?script", "(no)?script(\\s)*>", "<(\\s)*iframe", "iframe(\\s)*>", "<(\\s)*img",
"img(\\s)*>", "src(\\s)*=", "<(\\s)*a", "a(\\s)*>", "href(\\s)*=",
"style(\\s)*=", "function\\(", "eval\\(", "expression\\(", "javascript:",
"vbscript:", "view-source:", "window[\\s\\S]*location", "window\\.", "\\.location",
"document[\\s\\S]*cookie", "document\\.", "alert\\(", ":alert", "window[\\s\\S]*open",
"oncontrolselect", "oncopy", "oncut", "ondataavailable", "ondatasetchanged",
"ondatasetcomplete", "ondblclick", "ondeactivate", "ondrag", "ondragend",
"ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop",
"onerror", "onerroupdate", "onfilterchange", "onfinish", "onfocus",
"onfocusin", "onfocusout", "onhelp", "onkeydown", "onkeypress",
"onkeyup", "onlayoutcomplete", "onload", "onlosecapture", "onmousedown",
"onmouseenter", "onmouseleave", "onmousemove", "onmousout", "onmouseover",
"onmouseup", "onmousewheel", "onmove", "onmoveend", "onmovestart",
"onabort", "onactivate", "onafterprint", "onafterupdate", "onbefore",
"onbeforeactivate", "onbeforecopy", "onbeforecut", "onbeforedeactivate", "onbeforeeditocus",
"onbeforepaste", "onbeforeprint", "onbeforeunload", "onbeforeupdate", "onblur",
"onbounce", "oncellchange", "onchange", "onclick", "oncontextmenu",
"onpaste", "onpropertychange", "onreadystatechange", "onreset", "onresize",
"onresizend", "onresizestart", "onrowenter", "onrowexit", "onrowsdelete",
"onrowsinserted", "onscroll", "onselect", "onselectionchange", "onselectstart",
"onstart", "onstop", "onsubmit", "onunload", "select",
"insert", "delete", "from", "count\\(", "drop table",
"update", "truncate", "asc\\(", "mid\\(", "char\\(",
"xp_cmdshell", "exec", "master", "netlocalgroup administrators", "net user",
"or", "and", "\\+", "'", "\""};
for (String regex : regexArr) {
//匹配完整单词,避免误伤
if (Pattern.matches("\\w+", regex.trim())) {
regex = "\\b"+regex.trim()+"\\b";
}
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
return true;
}
}
}
后续如果发现还有,再补充。