gpt4 book ai didi

javascript - XSS黑名单/白名单

转载 作者:行者123 更新时间:2023-11-30 13:53:44 28 4
gpt4 key购买 nike

我需要实现 XSS 防御,但遇到了麻烦。我读了这个备忘单 https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html有很多有值(value)的信息,但对我来说实现起来相当困难。我明白,你需要逃避不受信任的数据,我已经在我的应用程序中实现了它,但我还需要实现某种黑名单/白名单,对吧?数据中允许什么,不允许什么。我试图在我的服务器端(java)使用这段代码,但我需要在前端使用类似的东西。我正在使用核心 javascript 和 jquery

  1. 这是一个好方法吗?
  2. 有没有什么库可以帮助我建立黑名单/白名单?
  3. 或者我如何确保转义数据不包含例如 javascript: 等?
  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("");

最佳答案

黑名单并没有真正起作用。它们只能涵盖与程序员已经想到的模式相匹配的攻击,但始终会发现新的变体和技术。参见 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 规则。在这里,有一些白名单的用途,但它们更容易实现,因为它们正在寻找特定的已知值。因此,规则 #7(避免 JavaScript URL)可以通过在您输出的任何 URL 的开头查找“http:”或“https:”来实现。规则 #6(清理 HTML 标记)可以使用另一个库来实现,该库被配置为仅允许特定的标签和值。

Yahoo 库看起来足够合理,可以转义,但看起来不再维护了。他们出于性能原因转义尽可能少的字符的方法需要比其他一些库更多的方法,您需要更加小心地为每个上下文使用完全正确的方法(例如 inSingleQuotedAttrinDoubleQuotedAttr )。相反,我会使用至少转义 & 的库, < , > , " , '用于他们的 HTML 转义,然后可以将许多这些方法合并在一起。

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

关于javascript - XSS黑名单/白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690970/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com