Подтвердить что ты не робот

Как неизменная строка Java повышает безопасность?

Я новичок в Java, и, изучая, я столкнулся с тем, что String является неизменным. Когда я читал причину этого, возникло несколько причин, например повышение производительности, поскольку его значение не может быть изменено и может использоваться несколькими потоками. Эти причины я понимаю.
Но я не понимаю, как это связано с безопасностью. Как String является неизменной помощью в безопасности Java?

Пожалуйста, помогите мне в понимании. Спасибо заранее.

4b9b3361

Ответ 1

Очень распространенная практика написания библиотек классов - это хранение параметров, передаваемых в ваш API, например, в конструкторе, например:

public class MyApi {
    final String myUrl;
    public MyApi(String urlString) {
        // Verify that urlString points to an approved server
        if (!checkApprovedUrl(urlString)) throw new IllegalArgumentException();
        myUrl = urlString;
    }
}

Если String изменен, это приведет к тонкому эксплойту: злоумышленник передаст хороший URL-адрес, дождитесь нескольких микросекунд, а затем установит URL-адрес на сайт атаки.

Поскольку сохранение без копирования является общепринятой практикой, и поскольку строки относятся к числу наиболее часто используемых типов данных, оставляя переменные strings, они откроют многие API, которые еще не написаны, но могут быть серьезными проблемами безопасности. Создание неизменяемых строк закрывает это особое отверстие безопасности для всех API, включая те, которые еще не написаны.

Ответ 2

Для концепции SecurityManager требуются неизменяемые строки. dasbklinkenlight уже на правильном пути со своим ответом, но измененные строки полностью разрушат концепцию песочницы.

Например, когда вы читаете файл new FileInputStream("foo");, реализация API будет внутренне выполнять среди других:

  • вызывать метод checkRead диспетчера безопасности с "foo" в качестве аргумента и выдавать исключение, если проверка не выполняется.
  • использовать вызовы операционной системы, чтобы фактически открыть файл, если проверка безопасности прошла

Если вызывающий может изменить строку между этими двумя шагами, проверка безопасности может быть успешной для одного файла, в то время как фактически будет открыт другой файл.

Ответ 3

Строка неизменна, означает, что вы не можете изменить сам объект, но можете, конечно, изменить ссылку. Когда вы вызываете (например) a = "ty", вы фактически меняете ссылку a на новый объект, созданный строковым литералом "ty". Изменение объекта означает использование его методов для изменения одного из его полей, например:

Foo x = new Foo("the field");
x.setField("a new field");
System.out.println(x.getField()); // prints "a new field"

а в неизменяемом классе (объявленном как final), например String, вы не можете изменить текущую строку, но вы можете вернуть новую строку, i.e:

String s = "some text";
s.substring(0,4);
System.out.println(s); // still printing "some text"
String a = s.substring(0,4);
System.out.println(a); // prints "some"