Việc để lộ các khóa chính của bạn (đặc biệt nếu chúng có thể dự đoán được) là một lỗ hổng được gọi là Tham chiếu Đối tượng Trực tiếp Không an toàn.
Bằng cách có một URL (hoặc bất kỳ khách hàng nào khác được cung cấp thông số) như sau:
http://www.domain.com/myaccount?userid=12
Bạn cung cấp cho người dùng cuối của mình cơ hội để xáo trộn các biến đó và chuyển bất kỳ dữ liệu nào họ thích. Thay vào đó, biện pháp khắc phục để giảm thiểu lỗ hổng này là tạo các tham chiếu đối tượng gián tiếp. Điều này nghe có vẻ giống như một sự thay đổi lớn, nhưng nó không nhất thiết phải như vậy. Bạn không phải đi và nhập lại tất cả các bảng của mình hoặc bất cứ thứ gì, bạn có thể làm điều đó chỉ bằng cách thông minh với dữ liệu của mình thông qua việc sử dụng bản đồ tham chiếu gián tiếp.
Hãy xem xét điều này:Bạn có một người dùng đang mua hàng trên trang web của bạn. Và khi đến lúc thanh toán, họ sẽ được xuất trình với một danh sách thả xuống số thẻ tín dụng của họ mà bạn có "trong hồ sơ". Nếu bạn nhìn vào mã cho trình đơn thả xuống, bạn sẽ thấy rằng số thẻ tín dụng được liên kết với các khóa 8055, 9044 và 10099.
Người dùng có thể nhìn vào điều này và nghĩ rằng chúng trông rất giống các khóa chính tự động tăng dần (người dùng có thể đúng). Vì vậy, anh ta bắt đầu thử các khóa khác để xem liệu anh ta có thể thanh toán bằng thẻ của người khác hay không.
Về mặt kỹ thuật, bạn nên có mã ở phía máy chủ để đảm bảo rằng thẻ đã chọn là một phần của tài khoản của người dùng và họ có thể sử dụng nó. Đây là một ví dụ giả định. Hiện tại, chúng tôi sẽ giả định rằng đây không phải là trường hợp này hoặc đây là một loại biểu mẫu khác có lẽ không có loại kiểm soát phía máy chủ đó.
Vậy làm cách nào để ngăn người dùng cuối chọn một khóa không nên có cho họ?
Thay vì hiển thị cho họ một tham chiếu trực tiếp đến bản ghi trong DB, hãy cung cấp cho họ một tham chiếu gián tiếp.
Thay vì đặt các khóa DB vào menu thả xuống, chúng tôi sẽ tạo một mảng trên máy chủ và đưa nó vào phiên của người dùng.
Array cards = new Array(3);
cards[0] = 8055;
cards[1] = 9044;
cards[2] = 10099;
Trong trình đơn thả xuống, bây giờ chúng tôi cung cấp tham chiếu đến chỉ mục của mảng nơi thẻ được lưu trữ. Vì vậy, thay vì nhìn thấy các khóa thực, người dùng cuối sẽ thấy các giá trị 0, 1 và 2, nếu họ xem nguồn.
Khi biểu mẫu được gửi, một trong những giá trị đó sẽ được chuyển cùng. Sau đó, chúng tôi lấy mảng ra khỏi phiên của người dùng và sử dụng chỉ mục để nhận giá trị. Khóa thực sự chưa bao giờ rời khỏi máy chủ.
Và người dùng có thể chuyển các giá trị khác nhau cả ngày nếu anh ta muốn, nhưng anh ta sẽ không bao giờ nhận được kết quả khác với thẻ của chính mình, bất kể kiểm soát truy cập phía máy chủ được áp dụng.
Hãy nhớ rằng khi sử dụng chỉ mục được truyền vào để lấy ra giá trị, nếu người dùng làm rối với nó, bạn có thể nhận được một số ngoại lệ (ArrayOutOfBounds, InvalidIndex, bất cứ điều gì). Vì vậy, hãy gói những thứ đó trong một lần thử / bắt để bạn có thể loại bỏ những lỗi đó và ghi lại các lỗi để tìm kiếm các nỗ lực bẻ khóa.
Hy vọng điều này sẽ hữu ích.
Để đọc thêm về Tham chiếu Đối tượng Trực tiếp Không an toàn, hãy xem OWASP Top 10. Đây là rủi ro số A4. https://www.owasp.org/index.php/Top_10_2010-A4 -Insecure_Direct_Object_Refferences