Câu hỏi tuyệt vời!
Về mặt phát triển web trên toàn thế giới, điều gì sẽ xảy ra nếu bạn hỏi những điều sau đây.
"Nếu đầu vào của người dùng xấu được cung cấp cho bộ điều khiển từ giao diện người dùng, bộ điều khiển có nên cập nhật Chế độ xem theo kiểu vòng lặp, buộc các lệnh và dữ liệu đầu vào phải chính xác trước khi xử lý chúng không? Làm thế nào? Điều kiện? Một khung nhìn được kết hợp chặt chẽ với một mô hình? Là logic kinh doanh cốt lõi xác thực đầu vào của người dùng của mô hình, hay nó là sơ bộ cho nó và do đó sẽ xảy ra bên trong bộ điều khiển (vì dữ liệu đầu vào của người dùng là một phần của yêu cầu)?
(Trong thực tế, có thể, và nên, một sự chậm trễ khởi tạo một mô hình cho đến khi có được đầu vào tốt?)
Ý kiến của tôi là các mô hình nên quản lý một tình huống thuần túy và nguyên sơ (càng nhiều càng tốt), không bị cản trở bởi xác thực nhập yêu cầu HTTP cơ bản sẽ xảy ra trước khi khởi tạo mô hình (và chắc chắn trước khi mô hình nhận được dữ liệu đầu vào). Vì việc quản lý dữ liệu trạng thái (liên tục hoặc nói cách khác) và các mối quan hệ API là thế giới của mô hình, hãy để xác thực nhập yêu cầu HTTP cơ bản xảy ra trong bộ điều khiển.
Tóm tắt.
1) Xác thực tuyến đường của bạn (được phân tích cú pháp từ URL), vì bộ điều khiển và phương thức phải tồn tại trước khi mọi thứ khác có thể đi tiếp. Điều này chắc chắn sẽ xảy ra trong vương quốc của bộ điều khiển phía trước (lớp Bộ định tuyến), trước khi đến bộ điều khiển thực sự. Duh. :-)
2) Một mô hình có thể có nhiều nguồn dữ liệu đầu vào: yêu cầu HTTP, cơ sở dữ liệu, tệp, API và có, mạng. Nếu bạn định đặt tất cả xác thực đầu vào của mình vào mô hình, thì bạn xem xét phần xác thực đầu vào yêu cầu HTTP của các yêu cầu nghiệp vụ cho chương trình. Trường hợp đóng cửa.
3) Tuy nhiên, việc cận thị nhiều đối tượng nếu đầu vào yêu cầu HTTP là không tốt! Bạn có thể biết liệu ** đầu vào yêu cầu HTTP ** có tốt không ( có kèm theo yêu cầu ) bằng cách xác thực nó trước khi khởi tạo mô hình và tất cả các độ phức tạp của nó (có, thậm chí nhiều trình xác thực hơn cho dữ liệu đầu vào / đầu ra API và DB).
Kiểm tra như sau:
a) Phương thức yêu cầu HTTP (GET, POST, PUT, PATCH, DELETE ...)
b) Các điều khiển HTML tối thiểu (bạn có đủ không?).
c) Các điều khiển HTML tối đa (bạn có quá nhiều không?).
d) Điều khiển HTML đúng (bạn có đúng không?).
e) Mã hóa đầu vào (thông thường, là mã hóa UTF-8?).
f) Kích thước đầu vào tối đa (có bất kỳ đầu vào nào nằm ngoài giới hạn không?).
Hãy nhớ rằng, bạn có thể nhận được chuỗi và tệp, do đó, việc chờ mô hình khởi tạo có thể rất tốn kém vì các yêu cầu tấn công máy chủ của bạn.
Những gì tôi đã mô tả ở đây nhấn vào mục đích của yêu cầu đến thông qua bộ điều khiển. Bỏ qua việc xác minh ý định sẽ khiến ứng dụng của bạn dễ bị tổn thương hơn. Ý định chỉ có thể là tốt (chơi theo quy tắc cơ bản của bạn) hoặc xấu (đi ra ngoài quy tắc cơ bản của bạn).
Ý định cho một yêu cầu HTTP là một đề xuất tất cả hoặc không có gì. Mọi thứ trôi qua, hoặc yêu cầu không hợp lệ . Không cần phải gửi bất cứ điều gì cho mô hình.
Mức cơ bản của mục đích yêu cầu HTTP này không liên quan gì đến các lỗi nhập và xác thực người dùng thông thường. Trong các ứng dụng của tôi, một yêu cầu HTTP phải hợp lệ theo năm cách trên để tôi tôn trọng nó. Theo cách nói chuyên sâu , bạn sẽ không bao giờ có được xác thực đầu vào của người dùng ở phía máy chủ nếu có năm điều này không thành công.
Có, điều này có nghĩa là ngay cả đầu vào tệp phải tuân theo các nỗ lực của bạn để xác minh và cho người dùng biết kích thước tệp tối đa được chấp nhận. Chỉ HTML? Không có JavaScript? Tốt, nhưng người dùng phải được thông báo về hậu quả của việc tải lên các tệp quá lớn (chủ yếu là họ sẽ mất tất cả dữ liệu biểu mẫu và bị loại khỏi hệ thống).
4) Điều này có nghĩa là dữ liệu đầu vào yêu cầu HTTP không phải là một phần của logic nghiệp vụ của ứng dụng? Không, nó chỉ có nghĩa là máy tính là thiết bị hữu hạn và tài nguyên phải được sử dụng một cách khôn ngoan. Nó có ý nghĩa để ngăn chặn hoạt động độc hại sớm hơn, không muộn hơn. Bạn trả nhiều tiền hơn trong các tài nguyên tính toán để chờ dừng lại sau này.
5) Nếu đầu vào yêu cầu HTTP là xấu, toàn bộ yêu cầu là xấu . Đó là cách tôi nhìn vào nó. Định nghĩa về đầu vào yêu cầu HTTP tốt được lấy từ các yêu cầu nghiệp vụ của mô hình, nhưng phải có một số điểm phân định tài nguyên. Bạn sẽ để một yêu cầu xấu tồn tại bao lâu trước khi giết nó và nói, "Ồ, này, đừng bận tâm. Yêu cầu tồi."
Phán quyết không chỉ đơn giản là người dùng đã phạm sai lầm đầu vào hợp lý, mà yêu cầu HTTP vượt quá giới hạn đến mức phải tuyên bố độc hại và dừng ngay lập tức.
6) Vì vậy, đối với tiền của tôi, yêu cầu HTTP (PHƯƠNG PHÁP, URL / tuyến đường và dữ liệu) là TẤT CẢ, hoặc KHÔNG CÓ gì khác có thể tiến hành. Một mô hình mạnh mẽ đã có các nhiệm vụ xác nhận để quan tâm đến chính nó, nhưng một người chăn tài nguyên tốt nói "Cách của tôi, hoặc đường cao. Hãy sửa lại, hoặc không đến chút nào."
Đây là chương trình của bạn, mặc dù. "Có nhiều hơn một cách để làm điều đó." Một số cách tốn nhiều thời gian và tiền bạc hơn những cách khác. Xác thực dữ liệu yêu cầu HTTP sau này (trong mô hình) sẽ có chi phí cao hơn trong suốt vòng đời của một ứng dụng (đặc biệt là nếu tăng hoặc giảm).
Nếu trình xác nhận của bạn là mô-đun, xác thực cơ bản * đầu vào yêu cầu HTTP ** trong bộ điều khiển sẽ không thành vấn đề. Chỉ cần sử dụng lớp Trình xác thực chiến lược, trong đó trình xác thực đôi khi cũng bao gồm các trình xác nhận chuyên biệt (e-mail, điện thoại, mã thông báo mẫu, captcha, ...).
Một số người coi điều này là hoàn toàn sai lầm, nhưng HTTP đang ở giai đoạn đầu khi Gang of Four viết các mẫu thiết kế: Các yếu tố của phần mềm hướng đối tượng có thể sử dụng lại .
================================================== ========================
Bây giờ, khi nó liên quan đến xác thực đầu vào của người dùng thông thường (sau khi yêu cầu HTTP được coi là hợp lệ), nó đang cập nhật chế độ xem khi người dùng rối tung lên mà bạn cần phải suy nghĩ! Loại xác nhận đầu vào của người dùng nên xảy ra trong mô hình.
Bạn không có gì đảm bảo về JavaScript ở mặt trước. Điều này có nghĩa là bạn không có cách nào để đảm bảo cập nhật không đồng bộ giao diện người dùng của ứng dụng với các trạng thái lỗi. Tăng cường tiến bộ thực sự cũng sẽ bao gồm cả trường hợp sử dụng đồng bộ.
Kế toán cho trường hợp sử dụng đồng bộ là một nghệ thuật bị mất ngày càng nhiều vì một số người không muốn trải qua thời gian và rắc rối, theo dõi trạng thái của tất cả các thủ thuật UI của họ (hiển thị / ẩn điều khiển, tắt / bật điều khiển , chỉ báo lỗi, thông báo lỗi) ở mặt sau (thường bằng cách theo dõi trạng thái trong mảng).
Cập nhật : Trong sơ đồ, tôi nói rằng View
nên tham khảo Model
. Không. Bạn nên truyền dữ liệu View
từ Model
để giữ khớp nối lỏng lẻo.