Dlaczego walidacja formularza HTML5 zezwala na e-maile bez kropki?

113

Piszę bardzo prostą makietę, aby zademonstrować walidację formularzy HTML5. Zauważyłem jednak, że weryfikacja adresu e-mail nie sprawdza kropki w adresie ani nie sprawdza znaków po tej kropce.

Innymi słowy, „john @ kowalski” jest uważane za prawidłowe, jeśli wyraźnie nie jest prawidłowym adresem e-mail; „łania” nie jest domeną.

Oto jak koduję moje pole e-mail:

<input type="email" required />

Czy to nie wystarczy?

Sprawdź to skrzypce, żeby zobaczyć, co mam na myśli.

Uwaga: zamiast tego wiem, jak to osiągnąć za pomocą wzorca RegEx. Zastanawiam się tylko, jak ktoś mógłby uciec z użyciem zamiast tego typu e-maila.

WEFX
źródło
10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Tak, doezdecydowanie może to być domena (pomyśl localhost), a ten adres jest technicznie prawidłowy zgodnie ze specyfikacją.
admdrew
2
@admdrew Heh ... to byłby interesujący przypadek, jeśli wysyłasz wiadomość e-mail z samego serwera poczty i decydujesz się napisać „przyjaciel @ localhost”
Katana314
@ Katana314 - heh, tak. Większość (dobrze skonfigurowanych) serwerów pocztowych będzie odrzucać wiadomości wysyłane na adresy, które nie pasują do oczekiwanej domeny, więc ogólnie rzecz biorąc, nie ma problemu z localhostadresami.
admdrew

Odpowiedzi:

84

Ponieważ a @ b to prawidłowy adres e-mail (np. Localhost to poprawna domena). Zobacz http://en.wikipedia.org/wiki/Email_address#Examples

Pamiętaj też, że zawsze powinieneś sprawdzać poprawność danych wejściowych na serwerze. Walidacja po stronie klienta powinna mieć na celu wyłącznie przekazywanie użytkownikowi informacji zwrotnej i nie można na niej polegać, ponieważ można ją łatwo ominąć.

Ali Alavi
źródło
7
Dzięki. Po prostu nie rozumiem, jak jakakolwiek firma mogłaby skorzystać na tej gotowej do użycia weryfikacji wiadomości e-mail. Facebook nie pozwoliłby nikomu zarejestrować się z adresem a @ b. Dzięki za informację. (Nie przegłosowałem twojej odpowiedzi)
WEFX,
6
W przypadku stron internetowych takich jak Facebook z publicznym dostępem nie ma to sensu. Ale pomyśl o wewnętrznych stronach internetowych. Możesz napisać do joe @ support. Ale myślę też, że ma minimalne zastosowanie. Niemniej jednak przeglądarki internetowe mają implementować się w oparciu o standardy (tj. RFC), a nie w oparciu o najczęstsze przypadki.
Ali Alavi
9
Zastanawiam się, kiedy ostatnio ktoś faktycznie wysłał e-mail do lokalnego hosta!
Matthew Lock
2
Jako jeden z najkrótszych Sidenote adresów e-mail produkcyjnym ( recordsetter.com/world-record/shortest-email-address/4327 ) jestau@ua
Kyborek
132

Teoretycznie możesz mieć adres bez znaku „.” w.

Ponieważ technicznie rzeczy takie jak:

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

Wszystkie są prawidłowe e-maile.

Tak więc standardowa walidacja HTML5 dopuszcza wszystkie prawidłowe wiadomości e-mail, w tym te rzadkie.

Aby uzyskać łatwe do odczytania wyjaśnienia (zamiast czytać standardy): http://en.wikipedia.org/wiki/Email_address#Examples

DBS
źródło
1
Zgoda, ten odpowiada „dlaczego”, a nie „rozwiązanie”. Byłem też ciekawy dlaczego. Teraz wiem, że nie trzeba „naprawiać”.
Eleanor Zimmermann
Przykładem pierwszego typu jest domena uz, która bezpośrednio wskazuje na adres IP z października 2018 r. Jeśli to zrobisz nslookup uz, wskazuje na 91.212.89.8, więc powinno być możliwe również posiadanie poczty e-mail w tej domenie.
PulseJet
36

Spróbuj dodać to do wejścia

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

Skrzypce

APAD1
źródło
2
Przy wielu nowych dostępnych domenach (księgowych [11], międzynarodowych [13] itp.) I potencjalnej maksymalnej długości 63, wartość długości wzorca wyrażenia regularnego powinna wynosić {2, 63}.
unasAquila
42
-1. Po pierwsze, nawet nie próbowałeś wyjaśnić, co to pozwala lub ogranicza, ani dlaczego ktoś chciałby mieć takie zasady. Po drugie, jest o wiele bardziej restrykcyjne niż pozwalają na to standardy (nie będę udawać, że przeczytałem i omówiłem standardy, ale zobacz na przykład en.wikipedia.org/wiki/Email_address# Internationalization lub wiele pytań dotyczących weryfikacji e-maili na Stack Przepełnienie przykładów dziwnych adresów e-mail). Dlaczego to robisz? Jeśli ktoś wpisuje coś niezwykłego jako e-mail, po prostu zaakceptuj go - prawdopodobnie wie lepiej od Ciebie.
Mark Amery,
7
Właściwie powiedziałbym, że „są szanse”, że popełniają błąd. Być może mają bardzo nietypowy adres e-mail, ale powiedziałbym, że w większości przypadków po prostu otrzymujesz poprawny adres e-mail zamiast nieprawidłowego, jeśli zatrzymasz go podczas weryfikacji i poprosisz o użytkownika do sprawdzenia.
Geoff Kendall,
1
Powinno to mieć ^, oznaczające, że powinno zaczynać się dopasowywanie od początku ciągu, a także akceptować duże litery:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese
13

RFC 822 , rozdział 6, daje określenie adresu w rozszerzonej notacji Backusa-Naura (BNF)

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

Korzystanie z tej specyfikacji a@b jest prawidłowym adresem.

AKTUALIZACJA

Odpowiadając na komentarz Trejkazu, dodaję następujące definicje. Widzimy, że SPACJA jest dozwolona, ​​ale tylko w cudzysłowie.

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
źródło
OTOH, RFC 822 pozwala mi również na umieszczanie spacji w części lokalnej, na co przynajmniej Chrome nie pozwala, więc nie jestem pewien, czy używają RFC jako odniesienia. (Choć powinny!)
Trejkaz
8

Na tej stronie MDN pokazuje, jakie przeglądarki wyrażeń regularnych powinny być używane do weryfikacji wiadomości e-mail:

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

Możesz nieznacznie zmienić to wyrażenie regularne, aby wymagało co najmniej jednej kropki w nazwie domeny: zmień gwiazdkę *na końcu wyrażenia regularnego na plus +. Następnie użyj tego wyrażenia regularnego jako patternatrybutu:

<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
źródło
3

Możesz dostosować wzór pola wiadomości e-mail:

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

dorycki
źródło
2

Oto, jak możesz to zrobić w html5, używając wzorca wyrażenia regularnego. Możesz także dołączyć własną wiadomość do wyświetlenia.

<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
źródło
-5

Ten wzór zawsze mi pasuje.

Tekst musi być pisany małymi literami, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"ale myślę, że obejmuje mniej więcej większość e-maili.

TSlegaitis
źródło