3

在我们的在线商店中,我们遇到了某个用户由于“无效的电子邮件地址”而无法购买的问题。它看起来像这样:

her.email.address.@docomo.ne.jp

我认为引发无效电子邮件错误的是电子邮件本地部分的尾随点。在代码中,我注释掉了第二个条件:

if (isc_substr($local, 0, 1) == '.' || isc_substr($local, -1, 1) == '.')

让它工作。这安全吗?还是我们应该建议客户更改她的电子邮件地址?

4

2 回答 2

11

该电子邮件地址确实违反了标准(RFC 5322),我建议用户更改她的地址。但是,当您允许本地部分以点结尾时,不应该有任何安全隐患。

该标准也不允许两个或多个连续的点,并且此限制可能与安全性更相关:想想类似../../. 是的,电子邮件地址中允许使用斜杠,并且没有为此准备的代码可能会对本地部分造成不良影响。机会很低,但是,你知道,我已经看到了……;)

由于该标准有点难以阅读,因此它是这样说的:

RFC 5322 允许在局部部分使用点,但是,有两个重要限制:它不允许两个或多个连续点,也不允许局部部分以点开始或结束。

第 3.4.1 节描述了local-part, 以及它可能具有的三种语法。“通常”的语法是dot-atom语法,本质上在第 3.2.3 节中定义为

dot-atom-text   =   1*atext *("." 1*atext)

atext可打印的 US-ASCII 字符在哪里,但有一些例外:

atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                    "!" / "#" /        ;  characters not including
                    "$" / "%" /        ;  specials.  Used for atoms.
                    "&" / "'" /
                    "*" / "+" /
                    "-" / "/" /
                    "=" / "?" /
                    "^" / "_" /
                    "`" / "{" /
                    "|" / "}" /
                    "~"

所以dot-atom-text基本上定义为“至少一个atext字符,后跟零个或多个[一个点后跟一个或多个atext字符]”。这意味着abc也可以a.bc.d,但.abc不是(因为它不以 开头atext),也不是a..b(因为没有atext跟随第一个点)或abc.(再次因为没有atext跟随)。

正如我上面所说,您可以选择忽略这些限制(尽管我建议不要允许连续的点),但基本上您的购物车软件完全正确地禁止该电子邮件地址。

于 2013-11-13T19:26:24.523 回答
3

编辑:我的旧答案是错误的。

我认为这条规则绝对没有安全隐患,但是RfC 5322明确地只允许在邮件地址的本地部分内使用点,而不是在开头和结尾。话虽如此,如果在实践中它仍然可以与许多邮件服务器一起使用,我不会感到惊讶。因此,虽然.@example.com根据RfC 5322不是有效地址,但出于实际目的,它可能是工作地址​​,只有邮件服务器example.com才能知道。

正如我所说,相关规范是RfC 5322,考虑到RfC 5321添加了本地部分不超过 64 个字符的限制。而且,是的,该标准允许大量地址,这些地址根本不适用于很多网站或邮件程序,例如"this is v@lid!"@example.com. 使用这种地址是不明智的,但这是因为软件错误导致它们不被接受。

于 2013-04-15T08:27:41.753 回答