在我们的在线商店中,我们遇到了某个用户由于“无效的电子邮件地址”而无法购买的问题。它看起来像这样:
her.email.address.@docomo.ne.jp
我认为引发无效电子邮件错误的是电子邮件本地部分的尾随点。在代码中,我注释掉了第二个条件:
if (isc_substr($local, 0, 1) == '.' || isc_substr($local, -1, 1) == '.')
让它工作。这安全吗?还是我们应该建议客户更改她的电子邮件地址?
在我们的在线商店中,我们遇到了某个用户由于“无效的电子邮件地址”而无法购买的问题。它看起来像这样:
her.email.address.@docomo.ne.jp
我认为引发无效电子邮件错误的是电子邮件本地部分的尾随点。在代码中,我注释掉了第二个条件:
if (isc_substr($local, 0, 1) == '.' || isc_substr($local, -1, 1) == '.')
让它工作。这安全吗?还是我们应该建议客户更改她的电子邮件地址?
该电子邮件地址确实违反了标准(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
跟随)。
正如我上面所说,您可以选择忽略这些限制(尽管我建议不要允许连续的点),但基本上您的购物车软件完全正确地禁止该电子邮件地址。
编辑:我的旧答案是错误的。
我认为这条规则绝对没有安全隐患,但是RfC 5322明确地只允许在邮件地址的本地部分内使用点,而不是在开头和结尾。话虽如此,如果在实践中它仍然可以与许多邮件服务器一起使用,我不会感到惊讶。因此,虽然.@example.com
根据RfC 5322不是有效地址,但出于实际目的,它可能是工作地址,只有邮件服务器example.com
才能知道。
正如我所说,相关规范是RfC 5322,考虑到RfC 5321添加了本地部分不超过 64 个字符的限制。而且,是的,该标准允许大量地址,这些地址根本不适用于很多网站或邮件程序,例如"this is v@lid!"@example.com
. 使用这种地址是不明智的,但这是因为软件错误导致它们不被接受。