Warum erlaubt die HTML5-Formularvalidierung E-Mails ohne Punkt?

112

Ich schreibe ein sehr einfaches Modell, um die Validierung von HTML5-Formularen zu demonstrieren. Ich habe jedoch festgestellt, dass bei der E-Mail-Überprüfung weder nach einem Punkt in der Adresse noch nach Zeichen gesucht wird, die diesem Punkt folgen.

Mit anderen Worten, "john @ doe" gilt als gültig, wenn es sich eindeutig nicht um eine gültige E-Mail-Adresse handelt. "doe" ist keine Domain.

So codiere ich mein E-Mail-Feld:

<input type="email" required />

Ist das nicht genug

Überprüfen Sie diese Geige, um zu sehen, was ich meine.

Hinweis: Ich weiß, wie dies stattdessen über ein RegEx-Muster erreicht wird. Ich frage mich nur, wie jemand davonkommen könnte, stattdessen den E-Mail-Typ zu verwenden.

WEFX
quelle
10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Ja, doekann definitiv eine Domain sein (denken localhost), und diese Adresse ist gemäß der Spezifikation technisch gültig.
Admdrew
2
@admdrew Heh ... das wäre ein interessanter Fall, wenn Sie eine E-Mail vom Mailserver selbst senden und beschließen, "friend @ localhost"
Katana314
@ Katana314 - heh, yup. Die meisten (gut konfigurierten) Mailserver lehnen Nachrichten ab, die an Adressen gesendet werden, die nicht mit einer erwarteten Domain übereinstimmen. Daher gibt es im Allgemeinen kein Problem mit localhostAdressen.
Admdrew

Antworten:

83

Weil a @ b eine gültige E-Mail-Adresse ist (z. B. localhost eine gültige Domain). Siehe http://en.wikipedia.org/wiki/Email_address#Examples

Beachten Sie außerdem, dass Sie die Eingabevalidierung immer auf dem Server durchführen sollten. Die clientseitige Validierung sollte nur dazu dienen, dem Benutzer Feedback zu geben, und nicht als verlässlich angesehen werden, da sie leicht umgangen werden kann.

Ali Alavi
quelle
7
Vielen Dank. Ich sehe nur nicht ein, wie ein Unternehmen von dieser sofort einsatzbereiten E-Mail-Validierung profitieren könnte. Facebook würde nicht zulassen, dass sich jemand mit einer a @ b-Adresse anmeldet. Danke für die Info. (Ich habe Ihre Antwort nicht abgelehnt)
WEFX
6
Bei Websites wie Facebook mit öffentlichem Zugang nützt dies nichts. Aber denken Sie an interne Websites. Vielleicht möchten Sie an joe @ support schreiben. Aber ich denke auch, dass es von minimalem Nutzen ist. Trotzdem müssen die Webbrowser basierend auf Standards (dh RFCs) implementiert werden, nicht basierend auf den häufigsten Fällen.
Ali Alavi
9
Ich frage mich, wann das letzte Mal jemand eine E-Mail an localhost gesendet hat!
Matthew Lock
2
Als Nebenbemerkung ist eine der kürzesten funktionierenden E-Mail-Adressen ( recordsetter.com/world-record/shortest-email-address/4327 )au@ua
Kyborek
132

Sie können theoretisch eine Adresse ohne "." im.

Da technisch Dinge wie:

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

Sind alle gültigen E-Mails.

Die Standard-HTML5-Validierung ermöglicht also alle gültigen E-Mails, einschließlich der ungewöhnlichen.

Für einige leicht zu lesende Erklärungen (anstatt die Standards durchzulesen ): http://en.wikipedia.org/wiki/Email_address#Examples

DBS
quelle
1
Einverstanden, dieser antwortet auf das "Warum", nicht auf die "Lösung". Ich war auch neugierig auf das Warum. Jetzt weiß ich nicht zu "reparieren".
Eleanor Zimmermann
Ein Beispiel für den ersten Typ ist die Domain uz, die ab Oktober 2018 direkt auf eine IP verweist. Wenn Sie eine machen nslookup uz, zeigt sie auf 91.212.89.8, sodass es möglich sein sollte, auch E-Mails in dieser Domain zu haben.
PulseJet
35

Versuchen Sie, dies der Eingabe hinzuzufügen

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

Geige

APAD1
quelle
2
Bei vielen neuen Domänen (z. B. Buchhalter [11], international [13] usw.) und einer potenziellen maximalen Länge von 63 sollte der Längenwert des Regex-Musters {2, 63} betragen.
unasAquila
42
-1. Erstens haben Sie nicht einmal versucht zu erklären, was dies erlaubt oder einschränkt oder warum jemand diese Regeln haben möchte. Zweitens ist es weitaus restriktiver als es die Standards erlauben (ich werde nicht so tun, als hätte ich die Standards gelesen und durchgearbeitet, aber siehe zum Beispiel en.wikipedia.org/wiki/Email_address#Internationalization oder die vielen Fragen zur E-Mail-Validierung auf Stack Überlauf für Beispiele für seltsame E-Mail-Adressen). Warum? Wenn jemand etwas Ungewöhnliches als E-Mail eingibt, akzeptieren Sie es einfach - wahrscheinlich wissen sie es besser als Sie.
Mark Amery
7
Eigentlich würde ich sagen, dass die "Chancen" stehen, dass sie einen Fehler machen. Es kann sein, dass sie eine sehr ungewöhnliche E-Mail-Adresse haben, aber ich würde sagen, dass Sie meistens einfach eine korrekte E-Mail-Adresse anstelle einer falschen erhalten würden, wenn Sie verhindern würden, dass die Validierung bestanden wird, und die Benutzer zu überprüfen.
Geoff Kendall
1
Dies sollte ein ^ haben, was bedeutet, dass es am Anfang der Zeichenfolge mit dem Matching beginnen und auch Großbuchstaben akzeptieren sollte:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese
13

Der RFC 822 , Kapitel 6, enthält die Angabe einer Adresse in erweiterter Backus-Naur-Form (BNF):

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

Die Verwendung dieser Spezifikation a@bist eine gültige Adresse.

AKTUALISIEREN

Um den Kommentar von Trejkaz zu beantworten, füge ich die folgenden Definitionen hinzu. Wir sehen, dass SPACE erlaubt ist, aber nur in Anführungszeichen.

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  
Ortomala Lokni
quelle
OTOH, RFC 822 erlaubt mir auch, Leerzeichen in den lokalen Teil einzufügen, was Chrome zumindest nicht zuzulassen scheint, daher bin ich mir nicht sicher, ob sie den RFC als Referenz verwenden. (Auch wenn sie sein sollten!)
Trejkaz
8

Auf dieser MDN-Seite werden die Regex-Browser angezeigt, mit denen die E-Mail überprüft werden soll:

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

Sie können diesen regulären Ausdruck leicht ändern, um mindestens einen Punkt im Domainnamen zu benötigen: Ändern Sie den Stern *am Ende des regulären Ausdrucks in ein Plus +. Verwenden Sie dann diesen regulären Ausdruck als patternAttribut:

<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>
Gitaarik
quelle
3

Sie können das Muster des E-Mail-Felds anpassen:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="[email protected]" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="[email protected]" />

Dorian
quelle
2

Hier erfahren Sie, wie Sie dies mit HTML5 mithilfe eines Regex-Musters tun können. Sie können auch eine benutzerdefinierte Nachricht zum Anzeigen einfügen.

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

Hari Das
quelle
-5

Dieses Muster funktioniert immer bei mir.

Text muss in Kleinbuchstaben geschrieben werden, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"aber ich denke, er deckt mehr oder weniger die meisten E-Mails ab.

TSlegaitis
quelle