Như những người khác đã nói, bạn nên làm cả hai. Đây là lý do tại sao:
Phía khách hàng
Bạn muốn xác thực đầu vào ở phía khách hàng trước vì bạn có thể cung cấp phản hồi tốt hơn cho người dùng trung bình . Ví dụ: nếu họ nhập địa chỉ email không hợp lệ và chuyển sang trường tiếp theo, bạn có thể hiển thị thông báo lỗi ngay lập tức. Bằng cách đó, người dùng có thể sửa mọi trường trước khi họ gửi biểu mẫu.
Nếu bạn chỉ xác nhận trên máy chủ, họ phải gửi biểu mẫu, nhận thông báo lỗi và cố gắng tìm ra vấn đề.
(Nỗi đau này có thể được giảm bớt bằng cách máy chủ kết xuất lại biểu mẫu với đầu vào ban đầu của người dùng được điền vào, nhưng xác thực phía máy khách vẫn nhanh hơn.)
Phía máy chủ
Bạn muốn xác thực về phía máy chủ vì bạn có thể bảo vệ chống lại người dùng độc hại , những người có thể dễ dàng bỏ qua JavaScript của bạn và gửi đầu vào nguy hiểm cho máy chủ.
Sẽ rất nguy hiểm khi tin tưởng UI của bạn. Họ không chỉ có thể lạm dụng UI của bạn, mà họ có thể không sử dụng UI của bạn, hoặc thậm chí là một trình duyệt . Điều gì xảy ra nếu người dùng chỉnh sửa URL theo cách thủ công hoặc chạy Javascript của riêng họ hoặc điều chỉnh các yêu cầu HTTP của họ bằng một công cụ khác? Điều gì xảy ra nếu họ gửi các yêu cầu HTTP tùy chỉnh từ curl
hoặc từ một tập lệnh chẳng hạn?
( Đây không phải là lý thuyết; ví dụ: tôi đã làm việc trên một công cụ tìm kiếm du lịch đã gửi lại tìm kiếm của người dùng cho nhiều hãng hàng không đối tác, công ty xe buýt, v.v., bằng cách gửi POST
yêu cầu như thể người dùng đã điền vào mẫu tìm kiếm của mỗi công ty, sau đó tập hợp và sắp xếp tất cả các kết quả. Mẫu JS của các công ty đó chưa bao giờ được thực thi và điều quan trọng đối với chúng tôi là họ cung cấp các thông báo lỗi trong HTML được trả lại. Tất nhiên, một API sẽ rất tốt, nhưng đây là điều chúng tôi phải làm. )
Không cho phép điều đó không chỉ ngây thơ từ quan điểm bảo mật, mà còn không chuẩn: khách hàng nên được phép gửi HTTP bằng bất cứ phương tiện nào họ muốn và bạn nên trả lời chính xác. Điều đó bao gồm xác nhận.
Xác thực phía máy chủ cũng rất quan trọng đối với khả năng tương thích - không phải tất cả người dùng, ngay cả khi họ đang sử dụng trình duyệt, sẽ bật JavaScript.
Phụ lục - Tháng 12 năm 2016
Có một số xác nhận thậm chí không thể được thực hiện đúng trong mã ứng dụng phía máy chủ và hoàn toàn không thể trong mã phía máy khách , vì chúng phụ thuộc vào trạng thái hiện tại của cơ sở dữ liệu. Ví dụ: "không có ai khác đã đăng ký tên người dùng đó" hoặc "bài đăng blog bạn đang bình luận vẫn tồn tại" hoặc "không có đặt chỗ hiện tại trùng với ngày bạn yêu cầu" hoặc "số dư tài khoản của bạn vẫn đủ để chi trả cho giao dịch mua đó . " Chỉ cơ sở dữ liệu có thể xác thực dữ liệu đáng tin cậy phụ thuộc vào dữ liệu liên quan. Các nhà phát triển thường xuyên làm hỏng việc này , nhưng PostgreSQL cung cấp một số giải pháp tốt .