XSS的黑名单/白名单

时间:2019-08-28 11:05:24

标签: javascript security xss

我需要实施XSS防御,但遇到了麻烦。 我读了这份备忘单 https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html 有很多有价值的信息,但是这对我来说很难实施。 我了解,您需要转义不受信任的数据,我已经在应用程序中实现了它,但是我还需要实现某种黑名单/白名单,对吗?数据中允许什么和不允许什么。 我试图在服务器端(即Java)上使用此代码,但是我需要在前端端进行类似的操作。我正在使用核心javascript和jquery

  1. 这是个好方法吗?
  2. 有没有可以帮助我建立黑名单/白名单的图书馆?
  3. 或者我如何确保转义的数据不包含例如javascript:etc?
  4. 我发现此库用于转义字符。 https://github.com/YahooArchive/xss-filters/wiki可以使用吗?

        // Avoid anything between script tags
        Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid anything in a src='...' type of expression
        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("");
    
        // Remove any lonesome </script> tag
        scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Remove any lonesome <script ...> tag
        scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid eval(...) expressions
        scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid expression(...) expressions
        scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid javascript:... expressions
        scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid vbscript:... expressions
        scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
        value = scriptPattern.matcher(value).replaceAll("");
    
        // Avoid onload= expressions
        scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
        value = scriptPattern.matcher(value).replaceAll("");
    

3 个答案:

答案 0 :(得分:2)

黑名单并没有真正起作用。它们只能涵盖与程序员已经想到的模式相匹配的攻击,但是一直都有新的变化和技术。例如,请参见XSS Filter Evasion Cheat Sheet

Chrome之类的浏览器付出了巨大的努力来尝试使用其过滤器检测XSS,但即使那样,他们现在仍计划删除它,因为它充满了漏洞并且阻止了合法输入(Google to remove Chrome's built-in XSS protection

您发现的过滤器特别糟糕。存在明显的遗漏,就像它寻找onload而不是onmouseover一样。它不处理嵌套值,因此<vbscript:script>alert(1)</scriptvbscript:>变为<script>alert(1)</script>。这些过滤器无法检测到很多类型的XSS攻击,就像是否同时使用多个参数一样。

相反,请专注于该备忘单上的OWASP规则。此处,白名单有一些用途,但由于它们正在寻找特定的已知值,因此白名单的实现更容易。因此,可以通过在要输出的任何URL的开头查找“ http:”或“ https:”来实现规则7(避免使用JavaScript URL)。规则#6(清理HTML标记)可以与另一个配置为仅允许特定标记和值的库一起实现。

Yahoo库看起来足够合理,可以转义,但看起来好像不再维护了。由于性能原因,他们的方法使用尽可能少的字符来转义,因此需要比其他库更多的方法,您需要更加谨慎地为每个上下文使用完全正确的方法(例如inSingleQuotedAttrinDoubleQuotedAttr)。取而代之的是,我会使用一个至少对&<>"'进行转义的库,然后对它们进行大量转义这些方法可以合并在一起。

使用JavaScript,大多数现代模板语言默认情况下都会转义值,或者您可以坚持使用基于文本的DOM方法,例如$().attr()$().text()而不是$().html(),那么就没有非常需要外部转义库。

答案 1 :(得分:0)

您可以添加转义文本来阻止反映的 XSS攻击,但是您确实应该考虑在Web服务器上实施安全标头以阻止存储的 XSS攻击。

请查看CSP Security Header,以获取有关如何实现的详细说明和文档。如果您使用类似NGINX的工具,则很容易实现。

如果您对此XSS攻击之间的区别有任何疑问,请告诉我。

答案 2 :(得分:0)

这可能对前端有用,您也可以在后端使用它。

String.prototype.preventXss = function () {
  const blackList = /['</>']/g;
  return this.replace(blackList, '');
};

let mystring = '<h1>';
console.log(mystring.preventXss());