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