Rest 电子邮件地址的ESAPI“;blabla@example.com&引用;

Rest 电子邮件地址的ESAPI“;blabla@example.com&引用;,rest,email-validation,esapi,Rest,Email Validation,Esapi,我看到了一些相关的问题。但我没有得到我想要的东西。抱歉,如果这是一个愚蠢的请求。希望我有这样一个具体的疑问: 所以我尝试用MySQL数据库制作一个RESTAPI。 我试图从一个表中读取数据,该表基本上是提取用户的有效电子邮件地址。 输出将显示在HTML页面上 temp = blabla@example.com temp = ESAPI.encoder().canonicalize(temp); temp = ESAPI.encoder().encodeForHTML(temp); 输出:tem

我看到了一些相关的问题。但我没有得到我想要的东西。抱歉,如果这是一个愚蠢的请求。希望我有这样一个具体的疑问:

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

temp = blabla@example.com
temp = ESAPI.encoder().canonicalize(temp);
temp = ESAPI.encoder().encodeForHTML(temp);
输出:
temp=blabla@;gmail.com

我怎样才能避免这种情况发生?得到blabla@email.com

我认为这里的行为和预期的一样。但我只是想知道是否有其他can条件处理的工作(if..else) 另外,如果有人能给我指出一些ESAPI设计选择背后的原因呢。我读起来应该很有趣

简短回答:

如果您能够真正信任来自数据库的内容,则无需执行规范化。如果您知道您的数据不会被浏览器使用,请不要为HTML编码。但是,如果您怀疑您的数据将被浏览器使用,请对其进行编码,让调用者处理结果。如果这被认为是不可接受的,则公开您的Web服务的“不安全”版本,该版本的URL将明确使用警告词标记为“潜在恶意”,迫使您的调用方意识到他们正在从事不安全的活动

长答覆:

首先,根据您的用例,您基本上是在向调用客户机提供数据。阅读您的问题时,我的第一反应是,我认为您对数据上下文不太熟悉

因此,当您需要安全数据来执行验证时,通常会看到调用
canonicalize()
。因此,首先要问的问题是:

问题1:我可以信任来自我数据库的数据吗

q1指南:如果数据得到了适当的验证和中和,比如通过调用
ESAPI.validator().getValidInput(args)
通过存储数据的进程,然后应用程序将安全电子邮件字符串存储到数据库中。如果此时可以证明您信任您的输入数据,那么您不必像这里这样规范化您的输出应该是完全安全的

但是,如果此时您不能信任数据,那么在将数据传递给下游系统之前,您需要对其进行验证。调用
ESAPI.validator().getValidInput(args)
将规范化输入并确保其为有效的电子邮件地址。然而,这带来了一个包袱,您的呼叫方必须正确地转换中和输入,根据您的问题,这是您想要避免的

如果您希望将安全数据发送到下游,并且您无法完全信任您的数据源,那么您别无选择,只能将安全数据发送给调用者,并让调用者在其端使用安全数据——也许除了公开一个不安全的方法,我将在稍后讨论

问题2:浏览器会被用来消费我的数据吗

q2指南:
encoder.encodeForHTML()
方法旨在消除浏览器的解释。既然您谈论的是RESTful web服务,我不明白您为什么认为需要使用它,因为浏览器应该正确解释
blabla@;gmail.com
转换为正确的规范格式——除非它可能被正确地捕获为数据元素,例如在下拉框中。但我猜这是你无法控制的


正如你现在所知道的,像这样的问题没有快速的答案。您必须对呼叫方将如何使用数据有一些了解。由于您可以通过浏览器将数据正确地作为数据处理,并且可以将数据作为代码处理,因此您可能会被迫提供“安全”和“不安全”调用来检索数据,前提是您无法控制客户端如何使用您的服务。这将使您陷入困境,因为懒惰的调用者可能只会使用不安全的版本。当这种情况在我的行业中发生时,我通常会使调用不安全函数的URL看起来像
mywebservice.com/unSafeNonPCICompliantMethod
或类似的东西,以便强制调用方明确接受风险。如果它在浏览器的正确上下文中使用。。。不安全的方法实际上可能是安全的。你就是不知道

使用HTML编码版本的电子邮件地址是抛出非法分号,而不是在组中的字符串。对此有何建议?无法在此处粘贴完整代码:“Message msg=new mimessage(session);msg.setFrom(新的Internet地址(用户名));InternetAddress[]toAddress={新的InternetAddress(ESAPI.encoder().encodeForHTML(toAddress))};msg.setRecipients(Message.RecipientType.TO,ToAddresss);msg.setSubject(主题);msg.setSentDate(新日期());'@DecKno我无法对其进行单元测试,但在我看来,当encodeForHTML的用例是在浏览器中向用户显示内容时,您正在生成一封电子邮件。在这种情况下,您需要规范化用户输入,并将其验证为合法的电子邮件地址。HTML(或其他类型的)编码实际上是在向用户显示内容之前立即完成的。谢谢您提供的信息。我把HTML作为一个解决方案来缓解电子邮件地址的CRLF,这很有效。但正如您所提到的,有没有其他方法可以在不修改电子邮件地址的情况下进行检查?