2012-07-20 36 views
16

Nếu bạn ràng buộc một cuộc gọi api đến id của đối tượng, có thể đơn giản là brute ép api này để có được tất cả các đối tượng? Nếu bạn nghĩ về MySQL, điều này hoàn toàn có thể với các id số nguyên gia tăng. Nhưng còn MongoDB thì sao? Các id có thể đoán được không? Ví dụ: nếu bạn biết một id, có dễ đoán các id khác (tiếp theo, trước đó) không?Id MongoDB có thể đoán được không?

Cảm ơn!

Trả lời

12

+1 cho câu trả lời của Sergio, về việc trả lời cho dù chúng có thể đoán được hay không, chúng không phải là băm, chúng có thể dự đoán được, vì vậy chúng có thể bị "cưỡng bức" đủ thời gian. Khả năng phụ thuộc vào cách ObjectID được tạo ra và cách bạn dự đoán. Để giải thích, đầu tiên, đọc spec ở đây:

http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

Chúng ta sau đó phá vỡ nó xuống từng miếng:

  • dấu thời gian - hoàn toàn có thể dự đoán miễn là bạn có một ý tưởng chung của khi dữ liệu được tạo ra
  • Máy - đây là băm MD5 của một trong một số tùy chọn, một số trong số đó dễ dàng được xác định hơn các tùy chọn khác, nhưng rất phụ thuộc vào môi trường
  • PID - một lần nữa, không phải số lượng lớn lues đây, và có thể được sleuthed cho dữ liệu được tạo ra từ một nguồn tiếng
  • Tăng - nếu điều này là một số ngẫu nhiên chứ không phải là một tăng (cả hai đều cho phép), sau đó nó là khó dự đoán hơn

Để mở rộng một chút trên các nguồn. ObjectIDs có thể được tạo ra bởi:

  • MongoDB bản thân (nhưng có thể được di chuyển, di chuyển, cập nhật)
  • Người tài xế (trên bất kỳ máy tính mà chèn hoặc cập nhật dữ liệu)
  • ứng dụng của bạn (bạn có thể tự chèn của bạn nếu bạn muốn)

Vì vậy, có những điều bạn có thể làm để khiến chúng khó đoán hơn, nhưng không có nhiều dự đoán và biện pháp bảo vệ, cho một tập dữ liệu bình thường, phạm vi của các ObjectID hợp lệ sẽ là khá dễ dàng để làm việc vì chúng đều được bắt đầu bằng dấu thời gian (trừ khi bạn đang thao tác điều này theo một cách nào đó).

11

ObjectId của Mongo không bao giờ có nghĩa là bảo vệ khỏi tấn công bạo lực (hoặc bất kỳ đòn tấn công nào). Họ đơn giản cung cấp tính độc đáo toàn cầu. Bạn nên không giả định rằng một số đối tượng không thể được truy cập bởi người dùng vì người dùng này không nên biết id của nó.

Để bảo vệ thực sự tài nguyên của bạn, hãy sử dụng các kỹ thuật khác.

Nếu bạn bảo vệ chống truy cập trái phép, hãy đặt một số logic ủy quyền trong ứng dụng của bạn (cho phép người dùng hợp pháp truy cập, từ chối cho mọi người khác).

Nếu bạn muốn cản trở việc bán phá giá tất cả các đối tượng, hãy sử dụng một số loại giới hạn tốc độ. Kết hợp với ủy quyền nếu có.

Đọc tùy chọn: Eric Lippert on GUIDs.

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