我需要实施XSS防御,但遇到了麻烦。 我读了这份备忘单 https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html 有很多有价值的信息,但是这对我来说很难实施。 我了解,您需要转义不受信任的数据,我已经在应用程序中实现了它,但是我还需要实现某种黑名单/白名单,对吗?数据中允许什么和不允许什么。 我试图在服务器端(即Java)上使用此代码,但是我需要在前端端进行类似的操作。我正在使用核心javascript和jquery
我发现此库用于转义字符。 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("");
答案 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库看起来足够合理,可以转义,但看起来好像不再维护了。由于性能原因,他们的方法使用尽可能少的字符来转义,因此需要比其他库更多的方法,您需要更加谨慎地为每个上下文使用完全正确的方法(例如inSingleQuotedAttr
与inDoubleQuotedAttr
)。取而代之的是,我会使用一个至少对&
,<
,>
,"
,'
进行转义的库,然后对它们进行大量转义这些方法可以合并在一起。
使用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());