这个问题在这里已经有答案了:
java字符串的不可变性如何提高安全性(3个答案)
四天前关门了。
通常听说字符串是不可变的,这提高了安全性。我理解这样的想法,因为字符串是最终的,它们的内容以后不能更改。但即使内容可以更改,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的。或者在实践中,这种攻击实际上是如何进行的?
我在网上看到一个例子,表明如果字符串是可变的,攻击者可以绕过安全性。我不明白。下面的代码是由服务提供商编写的。这是攻击者永远无法触及的部分。不管字符串是否可变,攻击者永远不能修改它们的值,对吗?
public class FileInputStream
{
private String filename;
public FileInputStream(String filename)
{
if (!allowedToReadFile(filename))
throw new SecurityException();
this.filename = filename;
}
...
}
1条答案
按热度按时间qc6wkl3g1#
假设字符串是可变的。在构造函数中,检查文件名并在对象中存储对字符串的引用。可能还有另一种方法使用该文件名打开文件。如果字符串的内容在调用该方法之前被修改为另一个文件名,那么该方法将打开新文件而不会失败
allowedToReadFile
检查,如果在开始时传递包含新内容的字符串,则会发生这种情况。在这种情况下,攻击者可以通过绕过检查并稍后更改字符串的内容来访问几乎任何文件。一般来说,使数据不可变可以避免许多安全问题和其他问题。如果字符串在java中是可变的,它不会阻止您从另一个线程更改字符串的内容。您甚至可能注意到字符串在函数调用期间发生了更改。将旧字符串的一半和新字符串的一半打印到屏幕上。它甚至可能会破坏unicode编码。另一个要问的问题是,当您更改文字时,文字会发生什么变化?浪费内存并创建一个由文本表示的字符串的新示例?或者只为一个文本创建一个字符串。如果字符串是可变的,那么应该有另一个系统来复制对象,可能是像c++那样的系统,在这个系统中字符串确实是可变的。分配字符串会复制它们。但是这是有代价的:复制或者需要一个新的复杂的语言特性,它允许移动、借用和常量引用传递给函数。jvm不是为这些特性设计的。