电子邮件本地部分的尾随点

时间:2013-04-15 08:20:13

标签: regex email email-address

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

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

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

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

让它发挥作用。这样安全吗?或者我们应该建议客户更改她的电子邮件地址吗?

2 个答案:

答案 0 :(得分:9)

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

标准也不允许有两个或多个连续点,这种限制可能更安全一些:想想../../之类的东西。是的,电子邮件地址中允许使用斜杠,而未为准备的代码可能使用本地部分做了一些讨厌的事情。机会很低,但是,你知道,我已经看到了的东西......;)

由于标准有点难以阅读,所以它的内容如下:

RFC 5322允许在本地部分使用点,但是,有两个重要的限制:它不允许两个或多个连续点,并且允许本地部分启动或以点结束。

Section 3.4.1描述了local-part及其可能具有的三种语法。 “通常”的语法是dot-atom语法,基本上在section 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(因为第一个点之后没有atextabc.(因为之后没有atext)。

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

答案 1 :(得分:2)

编辑:我的回答是错误的。

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

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