Linux添加白名单:XSS的黑名单 /白名单(alternative to blacklist)

我需要实现 XSS 防御,我有麻烦。我读了这个 cheatsheets://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html有很多有价值的信息,但我很难实现这一点。我明白,你需要逃避不受信任的数据,我已经在我的应用程序中实现了它,但我也需要实现某种黑名单 / 白名单,对吗?什么是允许的数据和什么是不允许的。我试图使用这个代码在 java 端

这是一个好方法吗?

是否有任何库可以帮助我建立黑名单 / 白名单?

或者如何确保转义的数据不包含例如 javascript:等?

我发现这个转义字符库。s://github/YahooArchive/xss-filters/wiki可以使用它吗?

    // Avoid anything between script tags
    Pattern scriptPattern = Patternpile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid anything in a src='...' type of expression
    scriptPattern = Patternpile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
    scriptPattern = Patternpile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
    // Remove any lonesome </script> tag
    scriptPattern = Patternpile("</script>", Pattern.CASE_INSENSITIVE);
    value = scriptPattern.matcher(value).replaceAll("");
    // Remove any lonesome <script ...> tag
    scriptPattern = Patternpile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid eval(...) expressions
    scriptPattern = Patternpile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid expression(...) expressions
    scriptPattern = Patternpile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid javascript:... expressions
    scriptPattern = Patternpile("javascript:", Pattern.CASE_INSENSITIVE);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid vbscript:... expressions
    scriptPattern = Patternpile("vbscript:", Pattern.CASE_INSENSITIVE);
    value = scriptPattern.matcher(value).replaceAll("");
    // Avoid onload= expressions
    scriptPattern = Patternpile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
    value = scriptPattern.matcher(value).replaceAll("");
3

黑名单实际上不起作用。它们只能覆盖与程序员已经想到的模式匹配的攻击,但是一直都有新的变化和技术。例如,请参阅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 的开头查找“:”或“s:”来实现规则 # 7 (避免 JavaScript URL)。规则 # 6 (清理 HTML 标记) 可以使用另一个库实现,该库配置为只允许特定标记。

Yahoo 库然后看起来足够合理的转义,但它看起来像它不再保持在一起。出于性能原因,他们转义最小可能字符的方法需要比其他一些库更多的方法,并且您需要更加小心地为每个上下文使用正确的方法(如inSingleQuotedAttrvsinDoubleQuotedAttr)。

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

1

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

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

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

0

这可能有助于前端,你也可以在后端使用这个。

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(621)
3ds大乱斗cia整合dlc:将3dsmax转换为 ansys
上一篇
C isp c se:在C://(no se crea)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(32条)