String 当字符串是可变的时,攻击是如何发生的?

String 当字符串是可变的时,攻击是如何发生的?,string,mutable,String,Mutable,通常听说字符串是不可变的,这提高了安全性。我理解因为字符串是最终的,所以它们的内容以后不能更改。但即使内容可以更改,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的 或者在实践中,这种攻击实际上是如何进行的 我在网上看到一个例子,表明如果字符串是可变的,攻击者可以绕过安全性。我不明白。下面的代码是由开发人员编写的。这是攻击者永远无法触及的部分。不管字符串是否可变,攻击者永远不能修改它们的值,对吗 public class FileInputStream { private Stri

通常听说字符串是不可变的,这提高了安全性。我理解因为字符串是最终的,所以它们的内容以后不能更改。但即使内容可以更改,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的

或者在实践中,这种攻击实际上是如何进行的

我在网上看到一个例子,表明如果字符串是可变的,攻击者可以绕过安全性。我不明白。下面的代码是由开发人员编写的。这是攻击者永远无法触及的部分。不管字符串是否可变,攻击者永远不能修改它们的值,对吗

public class FileInputStream
{
 private String filename;
 public FileInputStream(String filename)
 {
  if (!allowedToReadFile(filename))
  throw new SecurityException();
  this.filename = filename;
  }
  ...
 }

我相信您所指的是内存溢出,如果字符串是可变的,那么它的内存大小是固定的,无法更改;如果不是可变的,则可以输入足够长的值,该值可能溢出到其他内存区域,并覆盖其他变量的内容,从而引入安全风险

例如,假设您的程序中有两个变量var1和var2,它们都是预定义的字符串,大小为3字节,内存分配如下所示:

[var1, var1, var1, var2, var2, var2]
初始化时的实际值为:

[0,0,0,0,0,0]
然后查询用户输入,得到“aaaa”,内存堆栈如下所示

[a,a,a,a,0,0]
这意味着在第一个变量到第二个变量之间存在溢出


这非常依赖于语言。

听起来有些抽象,你能举个例子说明如何通过这种方式实现对更改打开另一个意外文件的攻击吗?我用一个例子编辑了我的回复谢谢你的例子。它非常详细。因此,假设攻击者知道如何分配内存,并且有查询输入供攻击者进行分配。我明白你的意思了吗?回想一下这个例子,如果是这样的话,恐怕这种攻击打开另一个文件的几率很低,因为攻击者怎么知道进行有意义的攻击是如此珍贵,即使他真的存在要覆盖的输入?这取决于你使用的语言,如果是c,它被编译成程序集,攻击者可以进行反向工程并查看内存布局。如果您认为此答案可以接受,请在“已接受”处标记,谢谢!很抱歉,对于上面的例子,我仍然看不出这是如何进行有意义的攻击,除非攻击只是简单地尝试输入足够大的输入来扰乱系统。