我基本上对这个问题进行了研究。我找到了这个教程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);
不知道我错过了什么,但这没有用。 如果您能引导我走上正确的道路,我将不胜感激。
最佳答案
此函数不会尝试删除标题标签。可能是因为它们不涉及 JavaScript。但它也没有删除涉及 JavaScript 的明显属性,例如“onmouseover”。它还缺少基本的反 XSS 规避技术。所以这个功能无法使用。
更好的资源是:OWASP XSS
这更多地侧重于根据周围的上下文转义输出数据。保护字符串的想法并没有真正起作用,因为不安全的内容取决于它的使用方式。 header 中的换行符需要转义,命令参数中的空格需要转义。它还会损坏有效数据。撇号可以出现在名称中,但在 SQL 查询中是元字符。
关于java - 如何保护字符串免受 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167295/