如何从XSS保护字符串?

时间:2017-04-02 10:31:57

标签: java 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[\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);

不知道我错过了什么,但这并没有奏效。 如果你能引导我走上正确的道路,我将非常感激。

2 个答案:

答案 0 :(得分:0)

此功能不会尝试删除标题标记。可能是因为它们不涉及JavaScript。但它也没有删除涉及JavaScript的明显属性,例如“onmouseover”。它也错过了基本的反XSS规避技术。所以这个功能无法使用。

更好的资源是:OWASP XSS

这更侧重于根据周围环境转发输出数据。保护字符串的想法并不真正起作用,因为不安全取决于它的使用方式。需要在标题中转义换行符,需要在命令参数中转义空格。它还会破坏有效数据。撇号可以出现在名称中,但在SQL查询中是元字符。

答案 1 :(得分:0)

我使用OWASP库来清理我的后端输入,请查看此帖子https://leantechblog.wordpress.com/2017/04/08/preventing-xss-sanitize-app-inputs/