Почему HTML5 form-validation позволяет отправлять электронные письма без точки?
Я пишу очень простой макет, чтобы продемонстрировать некоторую проверку формы HTML5. Однако я заметил, что проверка электронной почты не проверяет точку в адресе, а также не проверяет символы, следующие за указанной точкой.
другими словами," john@doe "считается действительным, когда это явно не действительный адрес электронной почты;" doe " не является доменом.
вот как я кодирую мое поле электронной почты:
<input type="email" required />
разве этого недостаточно?
проверить это скрипка чтобы увидеть, что я имею в виду.
примечание: Я знаю, как сделать это с помощью шаблона регулярных выражений вместо этого. Мне просто интересно, как кто-то мог уйти с помощью типа электронной почты.
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
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>