ID cơ sở dữ liệu phơi bày - rủi ro bảo mật?


133

Tôi đã nghe nói rằng việc lộ ID cơ sở dữ liệu (ví dụ: trong URL) là một rủi ro bảo mật, nhưng tôi gặp khó khăn để hiểu tại sao.

Bất kỳ ý kiến ​​hoặc liên kết về lý do tại sao nó là một rủi ro, hoặc tại sao nó không?

EDIT: tất nhiên quyền truy cập nằm trong phạm vi, ví dụ: nếu bạn không thể thấy tài nguyên, foo?id=123bạn sẽ gặp một trang lỗi. Nếu không, chính URL phải là bí mật.

EDIT: nếu URL là bí mật, có thể nó sẽ chứa mã thông báo được tạo có thời gian giới hạn, ví dụ: hợp lệ trong 1 giờ và chỉ có thể được sử dụng một lần.

EDIT (vài tháng sau): cách thực hành ưa thích hiện tại của tôi cho việc này là sử dụng UUIDS cho ID và phơi bày chúng. Nếu tôi đang sử dụng các số liên tiếp (thường để thực hiện trên một số DB) làm ID tôi thích tạo mã thông báo UUID cho mỗi mục nhập dưới dạng khóa thay thế và phơi bày điều đó.

Câu trả lời:


108

Với các điều kiện thích hợp, việc lộ số nhận dạng không phải là rủi ro bảo mật. Và, trong thực tế, sẽ vô cùng nặng nề khi thiết kế một ứng dụng web mà không để lộ các định danh.

Dưới đây là một số quy tắc tốt để làm theo:

  1. Sử dụng bảo mật dựa trên vai trò để kiểm soát quyền truy cập vào một hoạt động. Làm thế nào điều này được thực hiện tùy thuộc vào nền tảng và khung bạn đã chọn, nhưng nhiều người hỗ trợ mô hình bảo mật khai báo sẽ tự động chuyển hướng trình duyệt đến bước xác thực khi một hành động yêu cầu một số quyền.
  2. Sử dụng bảo mật lập trình để kiểm soát truy cập vào một đối tượng. Điều này khó hơn để làm ở cấp độ khung. Thường xuyên hơn, đó là thứ bạn phải viết vào mã của mình và do đó dễ bị lỗi hơn. Kiểm tra này vượt ra ngoài kiểm tra dựa trên vai trò bằng cách đảm bảo không chỉ người dùng có thẩm quyền cho hoạt động, mà còn có các quyền cần thiết đối với đối tượng cụ thể được sửa đổi. Trong một hệ thống dựa trên vai trò, thật dễ dàng để kiểm tra rằng chỉ những người quản lý mới có thể tăng lương, nhưng ngoài ra, bạn cần đảm bảo rằng nhân viên đó thuộc về bộ phận quản lý cụ thể.
  3. Đối với hầu hết các bản ghi cơ sở dữ liệu, điều kiện 1 và 2 là đủ. Nhưng việc thêm ID không thể đoán trước có thể được coi là một bảo hiểm bổ sung nhỏ hoặc "bảo mật chuyên sâu" nếu bạn mua vào khái niệm đó. Tuy nhiên, một nơi mà các định danh không thể đoán trước là một điều cần thiết, tuy nhiên, là trong ID phiên hoặc các mã xác thực khác, trong đó chính ID xác thực một yêu cầu. Chúng nên được tạo bởi một RNG mật mã.

27
IMO, thêm ID không thể đoán trước là cách tiếp cận "bảo mật thông qua che khuất" và có thể dẫn đến cảm giác an toàn sai lầm. Tốt hơn là tập trung vào (1) và (2) và đảm bảo kiểm soát truy cập của bạn là vững chắc.
stucampbell

4
Sử dụng RNG mật mã chắc chắn không "bảo mật thông qua che khuất". Kẻ tấn công không gần gũi hơn với việc đoán định danh đối tượng ngay cả khi cô ấy biết cách bạn tạo ra chúng. Bảo mật thông qua che khuất có nghĩa là nếu thuật toán bạn đang sử dụng được phát hiện, nó có thể bị khai thác. Nó không đề cập đến việc giữ bí mật, như các khóa hoặc trạng thái bên trong của RNG.
erickson

1
@stucampbell Có lẽ, nhưng điều đó không có nghĩa là bạn không nên sử dụng ID không thể đoán trước được. Lỗi xảy ra, vì vậy ID không thể đoán trước là một cơ chế an toàn bổ sung. Ngoài ra, kiểm soát truy cập không phải là lý do duy nhất để sử dụng chúng: ID có thể dự đoán có thể tiết lộ thông tin nhạy cảm, chẳng hạn như số lượng khách hàng mới trong một khung thời gian nhất định. Bạn thực sự không muốn tiết lộ thông tin như vậy.
user247702

1
@Stijn bạn thực sự không thể nói rằng tôi thực sự không muốn có thể tiết lộ bao nhiêu khách hàng. Ý tôi là McDonald có một dấu hiệu lớn nói rằng họ đã phục vụ 10 tỷ hamburger. Đó không phải là một rủi ro bảo mật, đó là một ưu tiên. Hơn nữa, bạn phải đăng nhập trước khi bạn thấy bất kỳ URL nào trong hầu hết các ứng dụng mà chúng tôi sẽ lo lắng về điều này. Vì vậy, chúng tôi sẽ biết ai đã cạo dữ liệu.
Wayne Bloss

1
Một điều mà tôi không thấy được đề cập trong cuộc trò chuyện này là từ quan điểm khắc phục sự cố và dễ sử dụng, có thể rất hữu ích khi ID được hiển thị trong một url để giúp người dùng hướng đến một tài nguyên cụ thể hoặc có thể có chúng để cho bạn biết chính xác tài nguyên họ đang xem. Bạn hầu như có thể tránh các mối quan tâm về kinh doanh thông minh bằng cách bắt đầu tăng tự động ở giá trị cao hơn, chỉ để đưa ra một ý tưởng.
Chockomonkey

47

Mặc dù không phải là rủi ro bảo mật dữ liệu nhưng đây hoàn toàn là rủi ro bảo mật thông tin kinh doanh vì nó phơi bày cả kích thước và tốc độ dữ liệu. Tôi đã thấy các doanh nghiệp bị tổn hại bởi điều này và đã viết về mô hình chống sâu này. Trừ khi bạn chỉ đang xây dựng một thử nghiệm chứ không phải là một doanh nghiệp, tôi rất khuyên bạn nên giữ id riêng tư của bạn ngoài tầm nhìn công khai. https://medium.com/lightrail/prevent-business-intellect-leaks-by-USE-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
Cuối cùng, câu trả lời lành mạnh mang lại các khía cạnh khác ngoài rủi ro bảo mật.
peceps

2
Đây phải là câu trả lời được chấp nhận. Nếu bạn cho rằng kẻ tấn công có thể bỏ qua bảo mật của bạn (điều bạn nên luôn luôn làm), bạn không muốn chỉ cung cấp loại thông tin này.
Kriil

@Kriil Họ thậm chí không cần bỏ qua bảo mật của bạn. Họ chỉ cần tạo một tài khoản!
Peter

32

Nó phụ thuộc vào những gì ID đại diện cho.

Hãy xem xét một trang web vì lý do cạnh tranh không muốn công khai số lượng thành viên họ có nhưng bằng cách sử dụng ID tuần tự sẽ tiết lộ nó trong URL: http://some.domain.name/user?id=3933

Mặt khác, nếu họ sử dụng tên đăng nhập của người dùng thay vào đó: http://some.domain.name/user?id=some họ sẽ không tiết lộ bất cứ điều gì mà người dùng chưa biết.


2
nếu bạn đang sử dụng ID tuần tự thì bạn đúng, nhưng nếu không thì điều đó sẽ không làm lộ ra bất cứ điều gì
orip

@orip: Như tôi đã nói, nó phụ thuộc vào những gì ai đó có thể khám phá bằng cách kiểm tra một số id. Có một mô hình? Họ có thể sử dụng thông tin đó để có được thông tin mà họ không có ý định không?
một số

@ John: Cảm ơn bạn đã chỉnh sửa. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi :)
một số

6
Tôi đã thực hiện chính xác điều này: đã sử dụng số ID tuần tự để xác định kích thước của cơ sở người dùng của đối thủ cạnh tranh.
Mi-chê

3
Họ ở khắp mọi nơi. Nhiều shoppingsites sử dụng một số tuần tự cho id đơn hàng. Đặt một đơn hàng tại một ngày và một đơn hàng vào một ngày khác và bạn biết họ đã nhận được bao nhiêu đơn hàng trong khoảng thời gian đó. Ngay cả khi bạn không biết các đơn đặt hàng có giá trị bao nhiêu tiền, bạn vẫn nhận được một dấu hiệu cho thấy doanh nghiệp hoạt động tốt như thế nào.
một số

25

Suy nghĩ chung đi theo những dòng này: "Tiết lộ ít thông tin về hoạt động bên trong của ứng dụng của bạn cho bất kỳ ai."

Việc lộ ID cơ sở dữ liệu được tính là tiết lộ một số thông tin.

Lý do cho điều này là tin tặc có thể sử dụng bất kỳ thông tin nào về hoạt động bên trong ứng dụng của bạn để tấn công bạn hoặc người dùng có thể thay đổi URL để truy cập vào cơ sở dữ liệu mà họ không cho phép xem?


1
Truy cập tài nguyên mà họ không cần phải xem - chỉ khi tôi không kiểm tra quyền (mà tôi làm, nếu không tôi có vấn đề bảo mật khác). Tiết lộ thông tin về "hoạt động bên trong" - đó chính xác là câu hỏi của tôi. Tại sao nó là một vấn đề?
orip

8
@orip: Đó là tất cả về an toàn nhất có thể. Nếu bạn là kiểu lập trình viên không mắc lỗi, thì đó không phải là vấn đề. Mặt khác, việc tiết lộ ít chi tiết sẽ khiến việc khai thác mã của bạn trở nên khó khăn hơn nếu (khi) bạn mắc lỗi. Chính nó, bạn đã đúng, nó không thêm bảo mật.
Adam Bellaire

@Adam: bảo mật bề ngoài có thể tồi tệ hơn không có bảo mật. Không có bảo mật bạn rõ ràng, với bảo mật hời hợt, bạn có thể nghĩ rằng nó bổ sung một cái gì đó không thể bỏ qua.
orip

16

Chúng tôi sử dụng GUID cho id cơ sở dữ liệu. Rò rỉ chúng là rất ít nguy hiểm.


Đây là những gì tôi sẽ đề nghị. Ít có khả năng đoán GUID trong cơ sở dữ liệu của bạn.
Jon Erickson

6
Điều này đến ở một hình phạt hiệu suất. Xem tại đây
Jeshurun

2
Điều thú vị 1 về việc sử dụng các hướng dẫn là bạn có thể cho phép khách hàng tạo id cơ sở dữ liệu. Điều thú vị 2 là họ không gặp vấn đề gì với cơ sở dữ liệu bị loại bỏ theo cách mà các id tăng tự động làm.
Brian White

Bạn có sử dụng các GUID này trong mã html làm thuộc tính id để xác định người dùng, nhận xét, bài đăng không? Để chỉ ra liên kết nào mà người dùng đã nhấp hoặc bài đăng nào anh ta muốn bình luận?
trzczy

7

Nếu bạn đang sử dụng ID số nguyên trong db của mình, bạn có thể giúp người dùng dễ dàng xem dữ liệu họ không nên bằng cách thay đổi biến qs.

Ví dụ: người dùng có thể dễ dàng thay đổi tham số id trong qs này và xem / sửa đổi dữ liệu họ không nên http: // someurl? Id = 1


7
Nếu tôi không kiểm tra quyền, tôi có một vấn đề bảo mật khác.
orip

nhưng câu trả lời là chính xác: "có thể"
Seun Osewa

1
Câu hỏi không phải là nếu bạn sẽ kiểm tra quyền. Đó là nếu thuê mới mà bạn không biết sẽ kiểm tra quyền.
Brian White

@BrianWhite - đó là lý do tại sao bạn muốn có một quy trình xem xét mã tại chỗ, để bạn có thể giáo dục họ trước khi nó bắt đầu sản xuất.
candu

2
Những gì chúng tôi làm là mã hóa id số nguyên khi được sử dụng trong URL hoặc biến mẫu.
Brian White

6

Khi bạn gửi id cơ sở dữ liệu đến máy khách của mình, bạn buộc phải kiểm tra bảo mật trong cả hai trường hợp. Nếu bạn giữ id trong phiên web của mình, bạn có thể chọn nếu bạn muốn / cần làm điều đó, nghĩa là có khả năng xử lý ít hơn.

Bạn liên tục cố gắng ủy thác mọi thứ cho kiểm soát truy cập của mình;) Đây có thể là trường hợp trong ứng dụng của bạn nhưng tôi chưa bao giờ thấy một hệ thống back-end nhất quán như vậy trong toàn bộ sự nghiệp của mình. Hầu hết trong số họ có các mô hình bảo mật được thiết kế để sử dụng không phải trên web và một số đã có các vai trò bổ sung được bổ sung sau đó, và một số trong số này đã được chốt bên ngoài mô hình bảo mật cốt lõi (vì vai trò đã được thêm vào trong bối cảnh hoạt động khác, nói trước web).

Vì vậy, chúng tôi sử dụng id cục bộ của phiên tổng hợp vì nó ẩn càng nhiều càng tốt.

Ngoài ra còn có vấn đề về các trường khóa không nguyên, có thể là trường hợp cho các giá trị được liệt kê và tương tự. Bạn có thể cố gắng vệ sinh dữ liệu đó, nhưng rất có thể bạn sẽ kết thúc giống như những chiếc bàn nhỏ bé .


4
Thật thú vị, mặc dù tôi sẽ nghĩ rằng việc kiểm tra tất cả đầu vào (bao gồm các tham số URL) cho mọi yêu cầu là rất phù hợp với web.
orip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.