我基本上对这个问题进行了研究。我发现本教程 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[rn]*=[rn]*\'(.*?)\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("src[rn]*=[rn]*\"(.*?)\"", 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);
不知道我错过了什么,但这没有奏效。如果您能引导我走上正确的道路,我将不胜感激。
此函数不会尝试删除标题标签。可能是因为它们不涉及JavaScript。但它也不会删除涉及JavaScript的明显属性,例如"onmouseover"。它还错过了基本的反XSS规避技术。因此,该功能不可用。
更好的资源是:OWASP XSS
这更侧重于根据周围上下文在输出时转义数据。保护字符串的想法实际上行不通,因为不安全的内容取决于它的使用方式。换行符需要在标头中转义,空格需要在命令参数中转义。它还会损坏有效数据。撇号可以出现在名称中,但在 SQL 查询中是元字符。