【问题标题】:Why does HTML5 form-validation allow emails without a dot?为什么 HTML5 表单验证允许不带点的电子邮件?
【发布时间】:2014-01-01 15:13:17
【问题描述】:

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

换句话说,“john@doe”被认为是有效的,但它显然不是一个有效的电子邮件地址; “doe”不是域。

这就是我对电子邮件字段进行编码的方式:

<input type="email" required />

这还不够吗?

查看fiddle 了解我的意思。

注意:我知道如何通过 RegEx 模式来实现这一点。我只是想知道为什么有人可以改用电子邮件类型。

【问题讨论】:

标签: html email-validation


【解决方案1】:

理论上,您可以有一个不带“.”的地址。在。

因为技术上的事情例如:

user@com
user@localserver
user@[IPv6:2001:db8::1]

都是有效的电子邮件。

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

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

【讨论】:

  • 同意,这个回答的是“为什么”,而不是“解决方案”。我也很好奇为什么。现在我知道不要“修复”。
  • 第一种类型的一个例子是域uz,它直接指向一个截至2018年10月的IP。如果你做一个nslookup uz,它指向91.212.89.8,所以它应该也可以在此域上拥有电子邮件。
【解决方案2】:

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

另外,请记住,您应该始终在服务器中进行输入验证。客户端验证应该只用于向用户提供反馈,而不是依赖它,因为它很容易被绕过。

【讨论】:

  • 谢谢。我只是看不到任何公司可以从这种开箱即用的电子邮件验证中受益。 Facebook 不会让某人使用 a@b 地址注册。谢谢你的信息。 (我没有否决你的回答)
  • 对于像 Facebook 这样的公共访问的网站,它是没有用的。但想想内部网站。您可能想写信给 joe@support。但我也认为它是最低限度的使用。然而,Web 浏览器是根据标准(即 RFC)来实现的,而不是基于最常见的情况。
  • 我想知道上一次有人真正向 localhost 发送电子邮件是什么时候!
  • 作为旁注,最短的工作电子邮件地址之一 (recordsetter.com/world-record/shortest-email-address/4327) 是 au@ua
  • a@b 是根据 RFC822 的有效地址,但这并不是故事的结束。 ICANN banned so-called "dotless" domains 早在 2013 年,因此它们在语法上是否有效无关紧要。
【解决方案3】:

尝试将其添加到输入中

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Fiddle

【讨论】:

  • -1。首先,您甚至没有试图解释这确实允许或限制了什么,也没有尝试解释为什么有人会想要这些规则。其次,它比标准允许的限制要严格得多(我不会假装已经阅读和摸索了这些标准,但是请参阅 en.wikipedia.org/wiki/Email_address#Internationalization 或 Stack Overflow 上的许多电子邮件验证问题以获取奇怪的电子邮件地址的示例) .为什么这样做?如果有人输入了一些不寻常的东西作为他们的电子邮件,请接受它 - 他们可能比你更了解。
  • 实际上,我会说他们犯了错误的“机会是”。它/可能/是他们有一个非常不寻常的电子邮件地址,但我会说大多数时候如果您阻止它通过验证并提示用户进行检查。
  • 这应该有一个^,表示它应该从字符串的开头开始匹配并且也接受大写:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
【解决方案4】:

RFC 822,第 6 章,给出了扩展巴科斯-瑙尔形式 (BNF) 中的地址规范:

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

使用此规范a@b 是一个有效的地址。

更新

为了回答 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  

【讨论】:

  • OTOH,RFC 822 还允许我在本地部分放置空格,Chrome 至少似乎不允许这样做,所以我不确定他们是否使用 RFC 作为参考。 (即使他们应该是!)
【解决方案5】:

这个 MDN 页面显示了浏览器应该用来验证电子邮件的正则表达式:

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

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

<form>
  <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])?)+$"
    title="Valid e-mail address including top-level domain"
    required
  />
  <button type="submit">Test</button>
</form>

【讨论】:

    【解决方案6】:

    您可以自定义电子邮件字段的模式:

    input:valid {
      border-color: green
    }
    
    input:invalid {
      border-color: red
    }
    Email:
    <input type="email" required value="a@b.c" /><br>
    
    Non-dots Email:
    <input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />

    【讨论】:

      【解决方案7】:

      以下是使用正则表达式模式使用 html5 的方法。您还可以包含要显示的自定义消息。

      <form>
        <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
        <button type="submit">Click Me</button>
      </form>

      【讨论】:

        【解决方案8】:

        PHP

        没有 TLD 的电子邮件在技术上是有效的。这就是浏览器验证“失败”的原因,可以这么说。

        如果您使用 PHP 处理表单数据,这里有一个简单的后端验证设置,涵盖您的电子邮件和必填字段:

        if (empty($required_field) OR empty($another_required_field) OR
            !filter_var($email_field, FILTER_VALIDATE_EMAIL)) {
            // error handling here
            exit;
            }
        

        FILTER_VALIDATE_EMAIL 不允许使用无点域名。

        因此,虽然“格式错误”的电子邮件可能会通过浏览器,但不会通过服务器。


        参考资料:

        【讨论】:

          【解决方案9】:

          这种模式总是适合我。

          文本必须小写pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$",但我认为它或多或少涵盖了大多数电子邮件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-05-16
            • 2012-01-30
            • 2016-01-17
            • 2011-09-04
            • 2013-11-05
            • 2013-04-19
            相关资源
            最近更新 更多