Làm sao cho người lạ đăng ký email trên website mà không để lộ danh sách người đã đăng ký?
Gợi ý trả lời
Người phỏng vấn muốn xem bạn nghĩ tới dữ liệu của người khác ngay từ thiết kế, và biết rằng "cho thêm nhưng không cho đọc" có những kẽ hở tinh vi hơn vẻ ngoài.
Cách đầu tiên ai cũng nghĩ tới là cho vai trò công khai (chưa đăng nhập) thêm dòng vào bảng. Nếu bạn lỡ cho cả quyền đọc, ai có khóa công khai của trang cũng lấy được cả danh sách. Bỏ quyền đọc thì chưa đủ: nếu cột email có ràng buộc duy nhất, việc thêm một email đã có trả về lỗi trùng, còn email mới thì im lặng, nên người ta dò được từng địa chỉ có trong danh sách hay không.
Cách tốt hơn là đóng hẳn bảng với vai trò công khai và chỉ mở một hàm. Hàm đó chạy với quyền cao hơn (kiểu security definer trong Postgres), kiểm tra và chuẩn hóa email, và trả về cùng một kết quả dù email mới hay đã có, nên không lộ gì. Chỉ tác giả hoặc quản trị viên đọc được bảng, thông qua chính sách của hàng. Thêm vào đó là lớp lọc robot rẻ tiền (một ô ẩn mà người thật không điền, thời gian điền form) và một giới hạn tần suất.
Cần nói thêm về quyền riêng tư: chỉ thu thứ thật sự cần, cho người đăng ký đường hủy không cần đăng nhập (một token ngẫu nhiên), và nói rõ email dùng để làm gì.
Điểm cộng: nhắc rằng đăng ký một bước dễ bị robot nhồi địa chỉ của người khác, và nếu cần gửi thư thật thì xác nhận hai bước qua email là bước tiếp theo.