2014-05-23 12 views
5

Tôi đang xây dựng một API REST cho một dịch vụ để truy vấn cơ sở dữ liệu MongoDB. Ban đầu, tôi đã đi đường tiêu chuẩn cung cấp "/ user/1" để tìm kiếm id người dùng 1, v.v. Khi tôi tiếp tục tham gia dự án, các nhà phát triển khác bắt đầu hỏi liệu chúng tôi có thể thêm khả năng tìm kiếm boolean hay không, chẳng hạn như "và", "không" và "hoặc". Nghĩ về khối lượng công việc cần thiết để tạo ra một DSL cho điều này, tôi nghĩ về chỉ có REST API chấp nhận một đối tượng MongoDB truy vấn JSON, như vậy (giả vờ này được truyền qua POST):Có phơi bày truy vấn mongodb trên REST API an toàn không?

/query/{"$or": [{"user": "1", "user", "2"}]} 

Bây giờ, trước khi tôi vượt qua truy vấn đến MongoDB, tôi sẽ làm như sau:

  1. Validate đối tượng JSON
  2. Hãy chắc chắn rằng chuỗi chỉ được sử dụng trong query chức năng, không update, runcommand, hoặc aggregation
  3. Xác minh rằng không có $where khoản trong truy vấn, since that allows script execution

Would làm điều này là đủ để ngăn chặn tiêm? Đọc MongoDB FAQ, có vẻ như việc chuyển JSON vào hoạt động truy vấn là vô hại, vì bạn không thể chạy bất kỳ javascript nào với nó (ngoại trừ $ where). Đây có phải là phương pháp an toàn để thực hiện không?

+0

có vẻ như bạn đang dùng cách tiếp cận mà tôi muốn thực hiện trên điểm cuối còn lại của mình, tôi có một câu hỏi mở về vấn đề này. http://stackoverflow.com/questions/25555956/mongodb-query-constructor-to-take-raw-query-string-java sẽ biết ơn nếu bạn có thể chia sẻ bất kỳ thông tin nào về cách tiếp cận có thể có. Chúc mừng – Will

Trả lời

0

Như bạn đã lưu ý, do tính chất phân tích cú pháp JSON có nghĩa là MongoDB không mở cho cùng loại tấn công "scripting" như có thể được thực hiện với API cho phép SQL truyền qua nó.

Đối với quan điểm của bạn 2. Cách tiếp cận thông thường là chỉ có một số hoạt động nhất định làm điểm cuối. Vì vậy, chẳng hạn như query hoặc với update và về cơ bản yêu cầu xác thực trên các hoạt động do khách hàng thực hiện. Vì vậy, bạn sẽ không để lộ các hoạt động nguy hiểm tiềm tàng đối với API.

Cũng có xác thực chung và vai trò cần xem xét. Vì vậy, bạn sẽ chỉ cho phép API thực hiện các hành động được cho phép bởi nó được trình bày "vai trò". Điều đó bảo vệ bạn một số chi tiết mà không nhất thiết cần phải kiểm tra điều này trong mã của bạn, hoặc ít nhất sau đó chỉ cần bẫy lỗi từ một hoạt động "trái phép".

Cuối cùng cho 3. như một giải pháp có thể để kiểm tra sự hiện diện của các nhà điều hành $where trong một truy vấn được cung cấp (mặc dù những hạn chế về những gì bạn có thể làm được tốt hơn với mỗi phiên bản), bạn thực sự có thể tắt chức năng này tắt trên máy chủ bằng cách sử dụng tùy chọn --noscipting.

Vì vậy, thực sự có một vài biện pháp bảo vệ bạn có thể thực hiện để giúp bạn tránh các cuộc tấn công "tấn công tập lệnh", nhưng nói chung cùng một loại mối nguy hiểm không tồn tại.

+0

Cảm ơn bạn đã kiểm tra sự tỉnh táo. May mắn thay, đối với ứng dụng tôi đang xây dựng, toàn bộ ứng dụng chỉ đọc, vì vậy tôi không phải lo lắng về vai trò và xác thực. Và tôi không thể sử dụng cờ 'noscripting', thật không may. Tôi sẽ đi trước và đi với cách tiếp cận này. – prentice

Các vấn đề liên quan