人们经常听到字符串是不可变的,这提高了安全性。我理解这样的想法,因为字符串是最终的,所以它们的内容不能在以后更改。但即使内容可以改变,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的。
或者在实践中,这种攻击实际上是如何进行的?
我在网上看到一个例子,表明如果字符串是可变的,攻击者就可以绕过安全机制。我还是不明白。以下代码是由开发人员编写的。这是攻击者永远不能接触的部分。不管字符串是不是可变的,攻击者都不能修改它们的值,对吧?
public class FileInputStream
{
private String filename;
public FileInputStream(String filename)
{
if (!allowedToReadFile(filename))
throw new SecurityException();
this.filename = filename;
}
...
}
发布于 2021-01-05 17:02:32
我相信你指的是内存溢出,如果一个字符串是可变的,那么它有一个固定的内存大小,不能改变,如果它不是,你可以输入一个足够长的值,它可以溢出到其他内存区域,并覆盖其他变量的内容,从而引入安全风险。
例如,假设您的程序中有两个变量var1和var2,这两个变量都是3字节大小的预定义字符串,那么您的内存分配将如下所示:
[var1, var1, var1, var2, var2, var2]
初始化时的实际值为:
[0,0,0,0,0,0]
然后查询用户输入,得到"aaaa",内存堆栈将如下所示
[a,a,a,a,0,0]
这意味着在第一个变量和第二个变量之间存在溢出。
这非常依赖于语言。
https://stackoverflow.com/questions/65575774
复制相似问题