Nói chung, nó dễ dàng hơn để viết và xem xét mã nhạy cảm khi giá trị không thay đổi , bởi vì có ít sự xen kẽ các hoạt động có thể ảnh hưởng đến kết quả.
Imagine mã như
void doSomethingImportant(String name) {
if (!isAlphaNumeric(name)) { throw new IllegalArgumentException(); }
Object o = lookupThingy(name);
// No chance of SQL-Injection because name is alpha-numeric.
connection.executeStatement("INSERT INTO MyTable (column) VALUES ('" + name + "')");
}
Mã này làm một số kiểm tra để ngăn chặn một sự leo thang của cơ quan, nhưng điều này chỉ đúng nếu isAlphaNumeric(name)
là đúng khi lập luận để executeStatement
được gọi.
Nếu hai câu lệnh đầu tiên được sắp xếp lại thì đây không phải là vấn đề, do đó, sự bất an phát sinh, một phần, từ sự xen kẽ xấu. Nhưng mã khác có thể gọi hàm này và giả định rằng name
không bị thay đổi bởi nó, do đó có thể phải thực hiện và thực hiện lại kiểm tra tính hợp lệ.
Nếu String
không phải là không thay đổi, thì có thể nó đã bị thay đổi bởi lookupThingy
. Để đảm bảo công việc kiểm tra bảo mật hoạt động, có một số lượng mã lớn hơn phải thực hiện chính xác cho mã này để bảo mật chống lại SQL injection.
Không chỉ là số lượng mã phải thực hiện chính xác lớn hơn, mà người duy trì thay đổi cục bộ thành một chức năng có thể ảnh hưởng đến tính bảo mật của các chức năng khác ở xa. Các hiệu ứng không cục bộ làm cho việc bảo trì mã khó khăn. Duy trì các thuộc tính bảo mật luôn dicey vì lỗ hổng bảo mật hiếm khi rõ ràng, do đó, khả năng đột biến có thể dẫn đến sự xuống cấp của bảo mật theo thời gian.
Tại sao nó một lý do chuỗi được thiết kế để không thay đổi?
Điều này tách biệt với lý do tại sao tính năng bảo mật kém. Nó được tin tưởng rộng rãi rằng các chương trình được viết bằng ngôn ngữ với các loại chuỗi không thay đổi sẵn có làm ít bản sao đệm không cần thiết hơn so với những bản không có. Các bản sao đệm không cần thiết ăn bộ nhớ, gây ra hiện tượng rung GC, và có thể gây ra các thao tác đơn giản trên các đầu vào lớn để thực hiện tồi tệ hơn nhiều so với các đầu vào nhỏ. Nó cũng được nhiều người tin rằng nó dễ dàng hơn để viết chương trình chính xác khi sử dụng dây bất biến, bởi vì bạn không có khả năng không phòng thủ sao chép một bộ đệm.
"Tôi nghĩ rằng việc kiểm tra chuỗi trước chúng ta e nó sẽ giải quyết vấn đề "Trừ khi bạn đang sử dụng một cách rõ ràng một số loại khóa, không. –
Nếu được triển khai không đúng cách, điều gì sẽ ngăn một người phạm tội thay đổi tham chiếu của séc? – Gamb
Có nhiều lý do mà chuỗi được thiết kế là không thay đổi, hiểu được sự bất biến như thế: * khi một lớp độc lập và hoàn toàn cụ thể. * – Azad