简短的回答:
如果您可以真正信任来自数据库的内容,则无需执行规范化。如果您知道您的数据不会被浏览器使用,请不要为 HTML 编码。但是,如果您怀疑您的数据将被浏览器使用,请对其进行编码,让调用者处理结果。如果这被认为是不可接受的,请公开您的 Web 服务的“不安全”版本,其 URL 将明确使用警告词将其标记为“潜在恶意”,从而迫使您的调用者意识到他们正在从事不安全的活动。
长答案:
首先,根据您的用例,您实际上是在向调用客户端提供数据。阅读您的问题后,我的第一反应是,我认为您对自己的数据上下文并不满意。
canonicalize()
因此,通常当您需要安全数据来执行验证时,您会看到调用。所以,首先要问的问题是:
q1:我可以信任来自我的数据库的数据吗?
q1 指南:如果数据得到适当的验证和中和,例如通过存储数据的进程调用ESAPI.validator().getValidInput( args );
,则应用程序会将安全的电子邮件字符串存储到数据库中。如果此时您可以证明您可以信任您的输入数据,那么您应该完全安全地不要像您在这里所做的那样规范化您的输出。
但是,如果此时您不能信任数据,那么您就处于这样一种情况,即在将数据传递给下游系统之前,您需要对其进行验证。调用ESAPI.validator().getValidInput( args );
将规范化输入并确保其是有效的电子邮件地址。然而,这伴随着您的呼叫者必须正确转换中和输入的包袱,根据您的问题,这是您想要避免的。
如果您想向下游发送安全数据,并且您无法可靠地信任您的数据源,那么您别无选择,只能将安全数据发送给您的调用者并让他们最终使用它——除了可能暴露一个不安全的方法,这我将很快讨论。
q2:浏览器会被用来消费我的数据吗?
q2 指南:该encoder.encodeForHTML()
方法旨在中和浏览器解释。既然你在谈论 RESTful Web 服务,我不明白你为什么认为你需要使用它,因为浏览器应该正确解释blabla@gmail.com
为正确的规范形式——除非它被正确地捕获为数据元素,例如在下拉框中。但这是我猜你无法控制的事情?
正如您现在所知道的,对于这样的问题没有快速的答案。您必须对调用者将如何使用数据有所了解。由于您有可能将您的数据正确地视为浏览器的数据,并且有可能将数据视为代码,因此您可能被迫提供“安全”和“不安全”调用来检索您的数据,假设您无法控制客户如何使用您的服务。这会让你陷入困境,因为懒惰的调用者可能只会使用不安全的版本。当这种情况发生在我的行业中时,我通常会这样做,以便调用不安全函数的 URL 看起来像mywebservice.com/unSafeNonPCICompliantMethod
或类似的东西,以便您强制调用者明确接受风险。如果它在浏览器上的正确上下文中使用...... unsafe 方法实际上可能是安全的。你只是不会知道。