Giả sử như sau:
lớp học của bạn làm việc gì đó quan trọng từ góc độ bảo mật hoặc tính riêng tư, và rằng tình trạng chkbox
được bằng cách nào đó được sử dụng trong việc thực hiện các lớp học của cơ chế riêng tư/an ninh của nó.
Phương thức chkBox()
có thể được gọi bằng một số mã không đáng tin cậy.
Bây giờ xem xét mã này:
// ... in an untrusted method ...
Foo foo = ...
String[] mwahaha = foo.chkBox();
mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo`
Bằng cách trả về một tham chiếu đến các mảng thực tế đại diện cho chkbox
, bạn cho phép mã bên ngoài đến lớp Foo
đạt trong và thay đổi trạng thái của nó.
Điều này là xấu từ quan điểm thiết kế (nó được gọi là "trừu tượng bị rò rỉ"). Tuy nhiên, nếu lớp này được sử dụng trong ngữ cảnh có thể có mã không tin cậy, thì phương thức này (phương pháp chkBox()
) là lỗ hổng bảo mật tiềm năng. Đó là những gì thông báo vi phạm đang cho bạn biết.
(Tất nhiên, kiểm tra mã có không có cách nào biết được nếu lớp học đặc biệt này là thực sự bảo mật quan trọng. Đó là để bạn có thể hiểu được. Những gì nó đang thực sự nói với bạn là "Hey! Nhìn đây! Đây là đáng ngờ!")
Việc sửa chữa phụ thuộc vào việc mã này (hoặc thực sự toàn bộ thư viện hoặc ứng dụng) là bảo mật quan trọng ... hoặc mã được bảo mật quan trọng trong một số triển khai trong tương lai. Nếu đây là một báo động giả, bạn chỉ có thể ngăn chặn các vi phạm; tức là đánh dấu nó vì thế sẽ bỏ qua kiểm tra Nếu đây là một vấn đề thực tế (hoặc có thể trở thành một vấn đề thực tế), sau đó, hoặc trả về một bản sao của mảng:.
return (String[]) chkBox.clone();
Nhưng rõ ràng, có một chi phí hiệu suất trong nhân bản mảng mỗi khi bạn gọi chkBox
. Ngoài ra, bạn có thể sửa đổi chkBox
phương pháp để trả lại một phần được chọn của mảng:
public String chkBox(int i) {
return chkBox[i];
}
Trong trường hợp này, tôi nghi ngờ rằng cách tiếp cận thay thế sẽ tốt hơn ... mặc dù nó phụ thuộc vào cách phương pháp này hiện đang được sử dụng.
Nguồn
2012-01-21 07:16:12
trong giải pháp trên, chúng ta sẽ kết thúc việc tạo một đối tượng String [] mới mỗi khi chúng ta truy cập nó qua clone() Tôi chỉ cần so sánh (và không kết thúc việc tạo một đối tượng mới) không ai có giải pháp tốt hơn? –
Tôi không hiểu điều này hữu ích như thế nào ngoài việc đánh bại Findbugs. Mảng sao chép vẫn có tham chiếu đến các chuỗi bao gồm trạng thái của obj. – David
@David Strings chỉ đọc, vì vậy chúng không thể thay đổi. –