我基本上对此问题进行了研究。我发现这个教程https://www.javacodegeeks.com/2012/07/anti-cross-site-scripting-xss-filter.html看起来很有用。所以我提取了我需要的重要部分:
public String stripXSS(String value) {
if (value != null) {
value = value.replaceAll("", "");
Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
}
return value;
}
然后我这样称呼它:
String filthy = "<h1>Need to secure this.</h1>";
String clean = stripXSS(filthy);
不知道我错过了什么,但这并没有奏效。 如果你能引导我走上正确的道路,我将非常感激。
答案 0 :(得分:0)
此功能不会尝试删除标题标记。可能是因为它们不涉及JavaScript。但它也没有删除涉及JavaScript的明显属性,例如“onmouseover”。它也错过了基本的反XSS规避技术。所以这个功能无法使用。
更好的资源是:OWASP XSS
这更侧重于根据周围环境转发输出数据。保护字符串的想法并不真正起作用,因为不安全取决于它的使用方式。需要在标题中转义换行符,需要在命令参数中转义空格。它还会破坏有效数据。撇号可以出现在名称中,但在SQL查询中是元字符。
答案 1 :(得分:0)
我使用OWASP库来清理我的后端输入,请查看此帖子https://leantechblog.wordpress.com/2017/04/08/preventing-xss-sanitize-app-inputs/