如何从 XSS 保护字符串



我基本上对这个问题进行了研究。我发现本教程 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 查询中是元字符。

最新更新