1

我看到了一些相关的问题。但我没有得到我想要的东西。对不起,如果这是一个愚蠢的要求。希望我有这个特定的查询:

所以我正在尝试用 MySQL 数据库制作一个 ReST API。我正在尝试从一个基本上提取用户有效电子邮件地址的表中读取数据。输出将显示在 HTML 页面上。

temp = blabla@example.com
temp = ESAPI.encoder().canonicalize(temp);
temp = ESAPI.encoder().encodeForHTML(temp);

输出:temp = blabla@gmail.com

我怎样才能避免这种情况发生?并获取 blabla@email.com

我认为这里的行为符合预期。但我只是想知道是否有其他方法可以解决其他条件处理(if..else)另外,如果有人能指出 ESAPI 的一些设计选择背后的原因怎么办。读起来应该很有趣。

4

1 回答 1

2

简短的回答:

如果您可以真正信任来自数据库的内容,则无需执行规范化。如果您知道您的数据不会被浏览器使用,请不要为 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 方法实际上可能是安全的。你只是不会知道。

于 2014-06-08T22:12:20.460 回答