Почему HTML5 form-validation позволяет отправлять электронные письма без точки?


Я пишу очень простой макет, чтобы продемонстрировать некоторую проверку формы HTML5. Однако я заметил, что проверка электронной почты не проверяет точку в адресе, а также не проверяет символы, следующие за указанной точкой.

другими словами," john@doe "считается действительным, когда это явно не действительный адрес электронной почты;" doe " не является доменом.

вот как я кодирую мое поле электронной почты:

<input type="email" required />

разве этого недостаточно?

проверить это скрипка чтобы увидеть, что я имею в виду.

примечание: Я знаю, как сделать это с помощью шаблона регулярных выражений вместо этого. Мне просто интересно, как кто-то мог уйти с помощью типа электронной почты.

8 76

8 ответов:

потому что@b является допустимым адресом электронной почты (например, localhost является допустимым доменом). См.http://en.wikipedia.org/wiki/Email_address#Examples

кроме того, имейте в виду, что вы всегда должны выполнять проверку ввода на сервере. Проверка на стороне клиента должна быть только для предоставления обратной связи пользователю и не должна полагаться, так как ее можно легко обойти.

теоретически вы можете иметь адрес без"." в.

Так как технически такие вещи, как:

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

все действительные электронные письма.

таким образом, стандартная проверка HTML5 позволяет использовать все допустимые электронные письма, включая необычные.

для некоторых легко читаемых объяснений (вместо чтения через стандарты): http://en.wikipedia.org/wiki/Email_address#Examples

попробуйте добавить это на вход

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

Скрипка

The RFC 822, Глава 6, дает спецификацию адреса в расширенной форме Backus-Naur (BNF):

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

используя эту спецификацию a@b является допустимым адресом.

обновление

чтобы ответить на комментарий Trejkaz, я добавляю следующие определения. Мы видим, что пространство разрешено, но только в кавычках.

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  

Вы можете настроить шаблон поля электронной почты:

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" />

на этой странице MDN он показывает, что браузеры регулярных выражений должны использовать для проверки электронной почты:

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

вы можете немного изменить это регулярное выражение, чтобы потребовать хотя бы одну точку в доменном имени: изменить звезду * в конце регулярного выражения в плюс +. Затем используйте это регулярное выражение как :

<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>

этот шаблон всегда работает для меня.

текст должен быть в нижнем регистре pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" но я думаю, оно охватывает более или менее большинство писем.

Это ответ на вопрос.

/^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/