Tại sao xác thực biểu mẫu HTML5 cho phép email không có dấu chấm?


112

Tôi đang viết một mô hình rất đơn giản để chứng minh một số xác thực biểu mẫu HTML5. Tuy nhiên, tôi nhận thấy xác thực email không kiểm tra một dấu chấm trong địa chỉ, cũng không kiểm tra các ký tự sau dấu chấm nói trên.

Nói cách khác, "john @ doe" được coi là hợp lệ khi nó rõ ràng không phải là một địa chỉ email hợp lệ; "doe" không phải là một miền.

Đây là cách tôi mã hóa trường email của mình:

<input type="email" required />

Như vậy là chưa đủ?

Kiểm tra fiddle này để xem ý tôi là gì.

Lưu ý: Thay vào đó, tôi biết cách thực hiện điều này thông qua mẫu RegEx. Tôi chỉ tự hỏi làm thế nào để ai đó có thể sử dụng loại email thay thế.


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Có, doechắc chắn có thể là một miền (nghĩ localhost) và địa chỉ đó hợp lệ về mặt kỹ thuật theo thông số kỹ thuật.
rút lại

2
@admdrew Heh ... đó sẽ là một trường hợp thú vị, nếu bạn đang gửi một E-mail từ mailserver chính nó, và quyết định viết "người bạn @ localhost"
Katana314

@ Katana314 - heh, yup. Hầu hết các máy chủ thư (được cấu hình tốt) sẽ từ chối các thư được gửi đến các địa chỉ không khớp với miền mong đợi, vì vậy nói chung không có vấn đề gì với localhostđịa chỉ.
rút lại

Câu trả lời:


83

Bởi vì a @ b là một địa chỉ email hợp lệ (ví dụ: localhost là một miền hợp lệ). Xem http://en.wikipedia.org/wiki/Email_address#Examples

Ngoài ra, hãy nhớ rằng bạn phải luôn thực hiện xác thực đầu vào trong máy chủ. Xác thực phía máy khách chỉ nên đưa ra phản hồi cho người dùng và không được dựa vào, vì nó có thể dễ dàng bị bỏ qua.


7
Cảm ơn. Tôi chỉ không thấy làm thế nào bất kỳ công ty nào có thể hưởng lợi từ việc xác thực email bên ngoài này. Facebook sẽ không cho phép ai đó đăng ký với địa chỉ a @ b. Cảm ơn thông tin mặc dù. (Tôi đã không phản đối câu trả lời của bạn)
WEFX 13/1213

6
Trong trường hợp các trang web như Facebook có quyền truy cập công khai thì không có ích gì. Nhưng hãy nghĩ đến các trang web nội bộ. Bạn có thể muốn viết thư để joe @ support. Nhưng tôi cũng nghĩ rằng đó là công dụng tối thiểu. Tuy nhiên, các trình duyệt web phải triển khai dựa trên các tiêu chuẩn (tức là RFC), không dựa trên các trường hợp phổ biến nhất.
Ali Alavi

9
Tôi tự hỏi lần cuối cùng ai đó thực sự gửi email đến localhost là khi nào!
Matthew Lock

2
Như một sidenote trong những địa chỉ email làm việc ngắn nhất ( recordsetter.com/world-record/shortest-email-address/4327 ) làau@ua
Kyborek

132

Về mặt lý thuyết, bạn có thể có một địa chỉ mà không có dấu "." trong.

Vì về mặt kỹ thuật những thứ như:

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

Là tất cả các email hợp lệ.

Vì vậy, xác thực HTML5 tiêu chuẩn cho phép tất cả các E-mail hợp lệ, kể cả những email không phổ biến.

Để có một số giải thích dễ đọc (Thay vì đọc qua các tiêu chuẩn): http://en.wikipedia.org/wiki/Email_address#Examples


1
Đồng ý, điều này trả lời 'tại sao', không phải 'giải pháp'. Tôi cũng tò mò về lý do tại sao. Bây giờ tôi biết không phải để "sửa chữa".
Eleanor Zimmermann

Ví dụ về loại đầu tiên là miền uz, trực tiếp trỏ đến một IP kể từ tháng 10 năm 2018. Nếu bạn làm như vậy nslookup uz, nó trỏ đến 91.212.89.8, vì vậy bạn cũng có thể có email trên miền này.
PulseJet

36

Hãy thử thêm cái này vào đầu vào

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

Vĩ cầm


2
Với rất nhiều miền mới có sẵn, tức là (kế toán [11], quốc tế [13], v.v.) và độ dài tối đa tiềm năng là 63, giá trị độ dài của mẫu regex phải là {2, 63}.
unasAquila

42
-1. Thứ nhất, bạn thậm chí chưa cố gắng giải thích những gì điều này cho phép hoặc hạn chế, cũng như tại sao ai đó lại muốn những quy tắc đó. Thứ hai, nó hạn chế hơn nhiều so với tiêu chuẩn cho phép (tôi sẽ không giả vờ đã đọc và tìm hiểu các tiêu chuẩn, nhưng hãy xem, ví dụ: en.wikipedia.org/wiki/Email_address#Internationalization hoặc nhiều câu hỏi xác thực email trên Stack Tràn cho các ví dụ về địa chỉ email lạ). Tại sao làm điều đó? Nếu ai đó đang nhập một cái gì đó bất thường vào email của họ, chỉ cần chấp nhận nó - rất có thể họ biết rõ hơn bạn.
Mark Amery

7
Trên thực tế, tôi muốn nói rằng "rất có thể" họ đang mắc sai lầm. Có thể / có thể / là họ có một địa chỉ email rất bất thường, nhưng tôi muốn nói rằng phần lớn thời gian bạn chỉ đơn giản là nhận được một địa chỉ email chính xác thay cho một địa chỉ không chính xác nếu bạn ngăn địa chỉ đó vượt qua xác thực và nhắc người dùng để kiểm tra.
Geoff Kendall

1
Điều này phải có ^, biểu thị nó phải bắt đầu khớp từ đầu chuỗi và cũng chấp nhận chữ hoa:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese

13

Các RFC 822 , chương 6, cung cấp cho các đặc điểm kỹ thuật của một địa chỉ trong tăng cường Backus-Naur Form (BNF):

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

Sử dụng đặc điểm kỹ thuật a@bnày là một địa chỉ hợp lệ.

CẬP NHẬT

Để trả lời nhận xét của Trejkaz, tôi thêm các định nghĩa sau. Chúng tôi thấy rằng SPACE được cho phép nhưng chỉ trong chuỗi được trích dẫn.

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 cũng cho phép tôi đặt khoảng trắng trong phần cục bộ, mà Chrome ít nhất dường như không cho phép, vì vậy tôi không chắc họ sử dụng RFC làm tham chiếu. (Mặc dù họ nên như vậy!)
Trejkaz

8

Trên trang MDN này, nó hiển thị các trình duyệt regex nên sử dụng để xác thực email:

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

Bạn có thể thay đổi một chút regex này để yêu cầu ít nhất một dấu chấm trong tên miền: thay đổi dấu sao *ở cuối regex thành dấu cộng +. Sau đó, sử dụng regex đó làm patternthuộc tính:

<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

Bạn có thể tùy chỉnh mẫu của trường 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

Đây là cách bạn có thể làm điều đó với html5 bằng cách sử dụng mẫu regex. Bạn cũng có thể bao gồm một thông báo tùy chỉnh để hiển thị.

<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

Mẫu này luôn phù hợp với tôi.

Văn bản phải ở dạng chữ thường pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"nhưng tôi nghĩ nó ít nhiều bao gồm hầu hết các email.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.