为什么HTML5表单验证允许没有点的电子邮件?

WEF*_*EFX 106 html5 email-validation

我正在编写一个非常简单的模型来演示一些HTML5表单验证.但是,我注意到电子邮件验证没有检查地址中的点,也没有检查点后面的字符.

换句话说,"john @ doe"被认为是有效的,当它显然不是有效的电子邮件地址时; "doe"不是域名.

这就是我编写电子邮件字段的方式:

<input type="email" required />
Run Code Online (Sandbox Code Playgroud)

这还不够吗?

检查这个小提琴,看看我的意思.

注意:我知道如何通过RegEx模式来实现这一点.我只是想知道如何使用电子邮件类型取而代之.

DBS*_*DBS 132

理论上你可以有一个没有"."的地址.在.

从技术上来说,例如:

user@com
user@localserver
user@[IPv6:2001:db8::1]
Run Code Online (Sandbox Code Playgroud)

都是有效的电子邮件.

因此,标准的HTML5验证允许所有有效的电子邮件,包括不常见的电子邮件.

对于一些易于阅读的解释(而不是阅读标准):http: //en.wikipedia.org/wiki/Email_address#Examples

  • 同意,这个回答“为什么”,而不是“解决方案”。我也很好奇这是为什么。现在我知道不要“修复”。 (2认同)
  • 允许无点域名,因此电子邮件也是如此。请阅读这篇文章,其中解释了这种无点域案例:https://www.bleepingcomputer.com/news/technology/dotless-domains-home-to-the-internet-s-shortest-urls/ (2认同)

Ali*_*avi 78

因为@b是有效的电子邮件地址(例如localhost是有效的域).请参见http://en.wikipedia.org/wiki/Email_address#Examples

另外,请记住,您应该始终在服务器中进行输入验证.客户端验证应仅用于向用户提供反馈而不是依赖,因为它可以被轻松绕过.

  • 我想知道上次有人真正发送电子邮件给localhost的时候! (9认同)
  • 谢谢.我只是没有看到任何公司如何从这个开箱即用的电子邮件验证中受益.Facebook不会让某人用@ b地址注册.谢谢你的信息.(我没有低估你的答案) (7认同)
  • 对于像Facebook这样具有公共访问权限的网站,它是没有用的.但想想内部网站.你可能想写信给joe @ support.但我也认为它是最少使用的.然而,Web浏览器将基于标准(即RFC)实现,而不是基于最常见的情况. (6认同)
  • 附带说明,最短的可用电子邮件地址之一(https://recordsetter.com/world-record/shortest-email-address/4327)是au @ ua。 (2认同)
  • 根据 RFC822,“a@b”是一个有效地址,但这并不是故事的结局。[ICANN 早在 2013 年就禁止了所谓的“无点”域名](https://www.icann.org/news/announcement-2013-08-30-en),因此它们在语法上是否有效并不重要。 (2认同)

APA*_*AD1 33

尝试将此添加到输入中

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"
Run Code Online (Sandbox Code Playgroud)

小提琴

  • -1.首先,你甚至没有试图解释这是允许或限制的,也不是为什么有人会想要这些规则.其次,它比标准允许的限制性要大得多(我不会假装阅读和制定标准,但请参阅http://en.wikipedia.org/wiki/Email_address#Internationalization或许多电子邮件有关奇怪电子邮件地址示例的Stack Overflow验证问题.为什么这样?如果有人在他们的电子邮件中输入一些不寻常的东西,那就接受它 - 他们比你知道的更有可能. (40认同)
  • 实际上,我会说他们犯了错误的"机会".它/可能是他们有一个非常不寻常的电子邮件地址,但我会说,如果你要阻止它通过验证并提示你,你大多数时间只是得到一个正确的电子邮件地址而不是一个错误的电子邮件地址.用户检查. (7认同)
  • 随着许多新域可用,即(会计[11],国际[13]等)和潜在的最大长度63,正则表达式的长度值应该是{2,63}. (2认同)
  • 这应该有一个 ^,表示它应该从字符串的开头开始匹配并接受大写:`^[A-Za-z0-9._%+-]+@[A-Za-z0-9。 -]+\.[A-Za-z]+$` (2认同)

Ort*_*kni 13

RFC 822,第6章,给出了一个地址的在扩充巴科斯范式(BNF)规范:

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)
Run Code Online (Sandbox Code Playgroud)

使用此规范a@b是有效的地址.

UPDATE

为了回答Trejkaz的评论,我添加了以下定义.我们看到SPACE是允许的,但仅限于带引号的字符串.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  
Run Code Online (Sandbox Code Playgroud)


git*_*rik 6

在此MDN页面上,它显示了正则表达式浏览器应使用该电子邮件来验证电子邮件:

https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/email#Validation

您可以稍稍更改此正则表达式,使其在域名中至少需要一个点:*将正则表达式末尾的星号更改为plus +。然后使用该正则表达式作为pattern属性:

<input type="email" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"></input>
Run Code Online (Sandbox Code Playgroud)