我一直在阅读关于 OWASP 和其他安全渠道的 XSS 预防。他们都说我应该使用 ESAPI 或类似的库,并通过白名单方法进行输入过滤。
但是,我使用默认编码的框架(Webobjects),因此使用 ESAPI 会更改我的输入,因此不适合我。
第二种选择是使用白名单方法。我支持多种语言,如日语、俄语、韩语等,那么我如何决定将哪些字符列入白名单?
另外,为什么白名单方法比 OWASP 提到的黑名单方法更好?为什么不阻止XSS一样使用字符的福<,>等?
我一直在阅读关于 OWASP 和其他安全渠道的 XSS 预防。他们都说我应该使用 ESAPI 或类似的库,并通过白名单方法进行输入过滤。
但是,我使用默认编码的框架(Webobjects),因此使用 ESAPI 会更改我的输入,因此不适合我。
第二种选择是使用白名单方法。我支持多种语言,如日语、俄语、韩语等,那么我如何决定将哪些字符列入白名单?
另外,为什么白名单方法比 OWASP 提到的黑名单方法更好?为什么不阻止XSS一样使用字符的福<,>等?
您需要将其列入黑名单的不仅仅是一小部分字符。在安全方面,我们遵循这个教条:
“有些事情我们知道我们知道。有已知的未知数。也就是说,有些事情我们现在知道我们不知道。但也有未知的未知数。有些事情我们不知道我们不知道知道。”
黑名单可能会帮助您防止前两种情况,白名单有助于涵盖所有三种情况:)
虽然很容易识别和验证一组无害的字符,但很难识别所有已知的坏字符。大多数防病毒软件都采用黑名单方法(签名),但是他们仍然无法捕获 0-day,因为他们不知道这是已知的错误,因此没有签名。
另外,为什么白名单方法比 OWASP 提到的黑名单方法更好。为什么不阻止 XSS 中使用的少数字符,例如 < 、 > 等
黑名单在某种意义上是静态的,它们可以防止“已知不良”的发生。这样做的问题是,每天都会发现新的攻击媒介,您需要不断更新您的黑名单以确保安全。另一方面,白名单更强大,因为您可以根据自己的需要创建过滤器。这回答了您关于 OWASP 为何建议使用白名单的问题。
我认为您可能太快拒绝了 ESAPI。为了防御 XSS,我建议您进行输出转义:将数据动态插入 HTML 文档的任何地方,转义数据(以适合该解析上下文的方式)。ESAPI 提供了转义库,非常有用。这不涉及“更改您的输入”。
有关更多信息,请阅读 OWASP 的XSS(跨站点脚本)预防备忘单,以及任何人都可以向白痴解释 XSS 吗?, 并在数据库之前或显示时过滤用户输入?,以及规范化和输出编码。
做输入过滤
一定要进行输入验证——根据规则接受或拒绝输入。不要尝试更改输入数据。如果您的网络服务器和您的应用程序语言之间的接口允许通过这些内容损害您的应用程序语言,那么就会有一些非常非常错误的东西。当然,您无法在应用程序代码中处理这种情况。
应用程序中的漏洞通常出现在数据离开您的应用程序语言的地方——在 XSS 的情况下,它们总是出现的地方。所以这是您应该对数据应用任何转换的点。转换必须适合数据的去向——如何转义正在写入数据库的数据与要写入 html 的数据非常不同。