Một biên giới là chỗ mức tin cậy đổi
Câu hỏi "validate input ở đâu" có một câu trả lời chính xác, và nó không phải "ở mọi nơi": validate ở mỗi biên giới tin cậy, và chỉ ở đó.
Một biên giới tin cậy là chỗ dữ liệu đi từ một vùng bạn kiểm soát ít sang một vùng bạn kiểm soát nhiều — hoặc ngược lại. Nó không phải một tầng trong kiến trúc và cũng không phải một dịch vụ; nó là một chỗ mức tin cậy đổi.
Sáu biên giới của một hệ thống web điển hình, và bốn cái sau thường bị bỏ:
| Biên giới | Từ → tới | Phải kiểm gì |
|---|---|---|
| Trình duyệt → API | Không tin → tin | Xác thực, phân quyền, validate, kích thước |
| API → cơ sở dữ liệu | Tin → tin | Tham số hoá (đây là biên giới interpreter, không phải tin cậy) |
| API → API bên ngoài | Tin → không tin | Không gửi thừa dữ liệu, kiểm đích (SSRF) |
| API bên ngoài → API | Không tin → tin | Validate response — module 7 |
| Job nền → cơ sở dữ liệu | Tin → tin, nhưng không qua HTTP | Nó bỏ qua mọi middleware |
| Người dùng có quyền → dữ liệu người khác | Tin → tin, nhưng đổi chủ thể | Đây là biên giới của module 2 |
Hai hàng cuối là hai biên giới quan trọng nhất và ít được vẽ nhất:
Job nền là một biên giới vì nó không đi qua bất kỳ middleware nào. Mọi biện pháp bạn đặt ở pipeline HTTP — xác thực, phân quyền, rate limit, validate — không tồn tại trên đường của một job. Đó là lý do RLS ở bài rls-second-layer có giá trị riêng: nó là lớp duy nhất nằm sau biên giới này.
Đổi chủ thể là một biên giới không có hình dạng vật lý, và đó là lý do nó bị bỏ. Khi một admin đọc dữ liệu của một người dùng, dữ liệu không đi qua mạng nào mới — nhưng ai được xem nó đã đổi, và đó là một biên giới cần kiểm và cần ghi log.
Và điều quan trọng nhất về biên giới: một biện pháp đặt sai biên giới là một biện pháp không tồn tại. Validate ở frontend là validate ở phía sai của biên giới đầu tiên. Kiểm quyền ở middleware là kiểm ở phía sai của biên giới thứ sáu — đúng thứ bài authn-vs-authz đã lập luận.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…