我看到了一些相关的问题。但我没有得到我正在寻找的东西。对不起,如果这是一个愚蠢的请求。希望我有这个特定的查询:
所以我试图用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设计选择背后的原因,该怎么办?我应该读一下这本书。
答案 0 :(得分:2)
简短的答案:
如果您真正信任来自您的数据库的内容,则不需要执行规范化。如果您知道您的数据不会被浏览器使用,请不要编码HTML。但是,如果您怀疑,您的数据将被浏览器使用,请对其进行编码,让调用者处理结果。如果这被认为是不可接受的,那就暴露出一种不安全的"您的webservice的一个版本,其URL将明确使用警告词标记为"可能是恶意的,"强迫您的来电者知道他们正在从事不安全的活动。
LONG ANSWER:
首先,根据您的用例,您实际上是在向主叫客户端提供数据。在阅读您的问题时,我的第一直觉是,我不认为您对数据上下文感到满意。
因此,当您需要安全数据来执行验证时,通常会看到对canonicalize()
的调用。所以,要问的第一个问题是:
q1:我可以信任来自我的数据库的数据吗?
q1指南:如果数据经过适当验证和中和,比如通过存储数据的进程调用ESAPI.validator().getValidInput( args );
,则应用程序会将安全的电子邮件字符串存储到数据库中。如果此时您可以信任您的输入数据,那么不规范化您的输出应该是完全安全的。
但是,如果此时无法信任该数据,那么您需要验证在将数据传递到下游系统之前的情况下,您需要验证它。对ESAPI.validator().getValidInput( args );
的调用将同时规范输入并确保其有效的电子邮件地址。然而,这需要您的呼叫者必须正确转换中和输入的行李,根据您的问题,这是您想要避免的。
如果您想向下游发送安全数据,并且您无法保证信任您的数据源,您别无选择,只能将安全数据发送给您的呼叫者并让他们在最终使用它 - 除非是为了暴露不安全方法,我将在稍后讨论。
问题2:浏览器会用于消耗我的数据吗?
q2指南:encoder.encodeForHTML()
方法旨在消除浏览器解释。既然您正在谈论RESTful Web服务,我就不明白为什么您认为需要使用它,因为浏览器应该正确地将blabla@gmail.com
解释为正确的规范形式 - 除非它可能是正确地被捕获为数据元素,例如在下拉框中。但这是我猜你无法控制的东西?
正如您现在所言,对此类问题没有快速答案。您必须知道调用者如何使用数据。由于您可以通过浏览器将数据正确地作为数据处理,并且数据被视为代码的可能性,您可能会被迫提供一个安全的"和"不安全"假设您无法控制客户端如何使用您的服务,请致电检索您的数据。这会让你陷入困境,因为懒惰的调用者可能只会使用不安全的版本。当我的行业发生这种情况时,我通常会这样做,以便调用不安全函数的URL看起来像mywebservice.com/unSafeNonPCICompliantMethod
或类似的东西,这样你就可以强制你的调用者明确接受风险。如果它在浏览器上的正确上下文中使用...不安全的方法可能实际上是安全的。你只是不知道。