2011-01-19 24 views

Trả lời

22

Có, CouchDB có thể ngăn chặn đọc trái phép. Thật không may, nó là hơi đơn giản.

Hãy tưởng tượng ứng dụng đấu giá bí mật. Bạn đặt giá thầu 20 đô la và tôi đặt giá thầu 10 đô la; mỗi giá thầu trong tài liệu đi văng. Couch cho phép chúng tôi đọc tài liệu giá thầu của riêng mình nhưng không có tài liệu nào khác. Tuy nhiên, có chế độ xem bản đồ-giảm hiển thị mức trung bình. Tôi tải chế độ xem và thấy rằng mức trung bình là 15 đô la, vì vậy tôi kết luận rằng giá thầu của bạn là 20 đô la và tôi đã vi phạm chính sách bảo mật. Xem đầu ra có thể làm rò rỉ một số hoặc tất cả thông tin của tài liệu. Không thể thực thi bảo mật ở cấp tài liệu. Đó là lý do tại sao truy cập đọc ở cấp cơ sở dữ liệu.

Tôi biết, nó rất tệ. Nhưng đó là câu trả lời đúng, có thể mở rộng.

Đây là một phần lý do triết lý Couch là tạo nhiều cơ sở dữ liệu — thậm chí một (hoặc nhiều hơn!) Cho mỗi người dùng. Quyền đọc cho cơ sở dữ liệu được đặt trong giá trị readers của cơ sở dữ liệu đối tượng _security. (Lưu ý, lĩnh vực readers was renamed to members trong CouchDB thân bởi vì nó cũng chỉ rõ những người có thể viết thư cho DB.)

Kỹ thuật này làm việc như thế này:

  1. Tạo một cơ sở dữ liệu cho mỗi người dùng. Nó sẽ giữ tất cả các tài liệu mà người dùng có thể đọc. Thêm người dùng (hoặc vai trò của người dùng) vào đối tượng _security.
  2. Trong cơ sở dữ liệu chính, hãy tạo một hàm bộ lọc thực hiện chính sách đọc. (Nó có thể chia sẻ mã với validate_doc_update.)
  3. Tái tạo từ cơ sở dữ liệu chính sang cơ sở dữ liệu của người dùng với ?filter=my_filter_function.
  4. Cho phép người dùng tải (hoặc nhân rộng từ) cơ sở dữ liệu của họ.

Tất nhiên, đây là tất cả cho một ứng dụng Couch thuần túy, nơi người dùng truy cập trực tiếp vào Couch. Nếu bạn có một lớp giữa (bộ điều khiển MVC, hoặc chỉ là một proxy HTTP ngược), thì bạn có thể thực thi chính sách ở đó, giữa người dùng và chiếc ghế dài. Nhưng hãy cẩn thận. Ví dụ: chức năng _show hoặc quy tắc _rewrite có thể cho phép người dùng tải chế độ xem hoặc tài liệu bất chấp chính sách của bạn.

Chúc may mắn!

+0

Cảm ơn! Bạn có thể giải thích về cách _show và _rewrite có thể cắn tôi không? Ngoài ra, làm cách nào để tránh các điều kiện chủng tộc như "không kết bạn với ai đó -> tải lên ảnh" và chắc chắn 100% rằng người không kết bạn không bao giờ có thể xem ảnh đó? – nornagon

+0

Vâng, giả sử bạn có proxy ngược lại cho phép/từ chối quyền truy cập trên mỗi tài liệu cho mỗi người dùng dựa trên URL. Sau đó, bạn thêm một tính năng mới bằng cách sử dụng hàm _list và tất cả các truy vấn _list đều được proxy cho phép. Người dùng có thể tìm ra cách sử dụng _list để xem các tài liệu mà anh ta không nên. Tương tự, quy tắc _rewrite có thể cung cấp cách xem tài liệu mà không có đường dẫn '/ db/doc_id' bình thường. Vì vậy, bạn phải * rất * chắc chắn rằng proxy của bạn không có lỗ hổng. – JasonSmith

+2

Câu hỏi thứ hai của bạn là nhiều hơn về ** thu hồi ** quyền truy cập đọc hơn ** cấp quyền truy cập đọc **. Tôi đề nghị bạn hỏi một câu hỏi mới ("Cách thu hồi quyền truy cập đọc trong mô hình bảo mật CouchDB"). Tôi sẽ chụp một câu trả lời nếu tôi có thể! – JasonSmith