Mengapa validasi formulir HTML5 mengizinkan email tanpa titik?


112

Saya sedang menulis mock-up yang sangat sederhana untuk mendemonstrasikan beberapa validasi formulir HTML5. Namun, saya perhatikan validasi email tidak memeriksa titik di alamat, juga tidak memeriksa karakter yang mengikuti titik tersebut.

Dengan kata lain, "john @ doe" dianggap valid, jika jelas bukan alamat email yang valid; "doe" bukan domain.

Beginilah cara saya mengkodekan bidang email saya:

<input type="email" required />

Apa itu belum cukup?

Periksa biola ini untuk melihat apa yang saya maksud.

Catatan: Saya tahu cara melakukannya melalui pola RegEx. Saya hanya ingin tahu bagaimana seseorang bisa lolos dengan menggunakan jenis email sebagai gantinya.


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Ya, doepasti bisa menjadi domain (pikirkan localhost), dan alamat itu secara teknis valid sesuai spesifikasi.
admdrew

2
@admdrew Heh ... itu akan menjadi kasus yang menarik, jika Anda mengirim E-mail dari server surat itu sendiri, dan memutuskan untuk menulis "friend @ localhost"
Katana314

@ Katana314 - heh, yup. Sebagian besar server email (dikonfigurasi dengan baik) akan menolak pesan yang dikirim ke alamat yang tidak sesuai dengan domain yang diharapkan, jadi secara umum tidak ada masalah dengan localhostalamat.
admdrew

Jawaban:


83

Karena a @ b adalah alamat email yang valid (misalnya localhost adalah domain yang valid). Lihat http://en.wikipedia.org/wiki/Email_address#Examples

Juga, perlu diingat bahwa Anda harus selalu melakukan validasi input di server. Validasi sisi klien seharusnya hanya untuk memberikan umpan balik kepada pengguna dan tidak dapat diandalkan, karena dapat dengan mudah dilewati.


7
Terima kasih. Saya hanya tidak melihat bagaimana perusahaan mana pun bisa mendapatkan keuntungan dari validasi email out-of-box ini. Facebook tidak akan membiarkan seseorang mendaftar dengan alamat a @ b. Terima kasih atas infonya. (Saya tidak
meremehkan

6
Dalam kasus situs web seperti Facebook dengan akses publik, itu tidak ada gunanya. Tapi pikirkan situs web internal. Anda mungkin ingin menulis ke joe @ support. Tetapi saya juga berpikir bahwa ini adalah penggunaan minimum. Namun demikian, browser web diimplementasikan berdasarkan standar (yaitu RFC), bukan berdasarkan kasus yang paling umum.
Ali Alavi

9
Saya bertanya-tanya kapan terakhir kali seseorang benar-benar mengirim email ke localhost!
Matthew Lock

2
Sebagai catatan, salah satu alamat email terpendek yang berfungsi ( recordsetter.com/world-record/shortest-email-address/4327 ) adalahau@ua
Kyborek

132

Anda secara teoritis dapat memiliki alamat tanpa "." di.

Karena secara teknis hal-hal seperti:

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

Apakah semua email yang valid.

Jadi validasi HTML5 standar memungkinkan semua email yang valid, termasuk yang tidak umum.

Untuk beberapa penjelasan yang mudah dibaca (Alih-alih membaca melalui standar): http://en.wikipedia.org/wiki/Email_address#Examples


1
Setuju, yang ini menjawab 'mengapa', bukan 'solusi'. Saya juga penasaran kenapa. Sekarang saya tahu untuk tidak "memperbaiki".
Eleanor Zimmermann

Contoh dari tipe pertama adalah domain uz, yang langsung menunjuk ke IP per Oktober 2018. Jika Anda melakukannya nslookup uz, itu menunjuk ke 91.212.89.8, jadi mungkin untuk memiliki email di domain ini juga.
PulseJet

36

Coba tambahkan ini ke masukan

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

Biola


2
Dengan banyak domain baru yang tersedia yaitu (akuntan [11], internasional [13] dll) dan panjang maksimum potensial 63 nilai panjang pola regex harus {2, 63}.
unasAquila

42
-1. Pertama, Anda bahkan belum mencoba menjelaskan apa yang diizinkan atau dibatasi ini, atau mengapa seseorang menginginkan aturan itu. Kedua, ini jauh lebih ketat daripada izin standar (saya tidak akan berpura-pura telah membaca dan merusak standar, tetapi lihat, misalnya, en.wikipedia.org/wiki/Email_address#Internationalization atau banyak pertanyaan validasi email di Stack Melimpah untuk contoh alamat email yang aneh). Mengapa melakukannya? Jika seseorang memasukkan sesuatu yang tidak biasa sebagai email mereka, terima saja - kemungkinan besar mereka tahu lebih baik daripada Anda.
Mark Amery

7
Sebenarnya, saya akan mengatakan bahwa "kemungkinan besar" mereka membuat kesalahan. Mungkin saja mereka memiliki alamat email yang sangat tidak biasa, tetapi saya akan mengatakan sebagian besar waktu Anda hanya mendapatkan alamat email yang benar sebagai ganti yang salah jika Anda menghentikannya melewati validasi dan meminta pengguna untuk memeriksa.
Geoff Kendall

1
Ini harus memiliki ^, menandakan itu harus mulai cocok dari awal string dan juga menerima huruf besar:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese

13

The RFC 822 , pasal 6, memberikan spesifikasi alamat di augmented Backus-Naur Form (BNF):

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

Menggunakan spesifikasi ini a@badalah alamat yang valid.

MEMPERBARUI

Untuk menjawab komentar Trejkaz, saya menambahkan definisi berikut. Kami melihat bahwa SPACE diperbolehkan tetapi hanya dalam string yang dikutip.

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 juga mengizinkan saya untuk meletakkan spasi di bagian lokal, yang setidaknya tidak diizinkan oleh Chrome, jadi saya tidak yakin mereka menggunakan RFC sebagai referensi. (Meskipun seharusnya begitu!)
Trejkaz

8

Pada halaman MDN ini menunjukkan regex browser yang harus digunakan untuk memvalidasi email:

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

Anda dapat sedikit mengubah ekspresi reguler ini agar memerlukan setidaknya satu titik dalam nama domain: ubah bintang *di akhir ekspresi reguler menjadi plus +. Kemudian gunakan regex itu sebagai patternatribut:

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

3

Anda dapat menyesuaikan pola bidang email:

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


2

Berikut adalah bagaimana Anda bisa melakukannya dengan html5 menggunakan pola regex. Anda juga dapat menyertakan pesan khusus untuk ditampilkan.

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


-5

Pola ini selalu berhasil untuk saya.

Teks harus dalam huruf kecil pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"tapi menurut saya itu mencakup lebih atau kurang sebagian besar email.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.