Java字符串如何变为不可变增加安全性?

Lol*_*lly 16 java security string

我是Java的新手,在学习的时候,我发现了一个String不可变的事实.当我阅读其背后的原因时,出现了一些原因,例如性能提升,因为它的值无法修改,并且可以由多个线程共享.这些理由我明白了.
但我不知道它与安全性有什么关系.如何String在Java安全性中提供不可变的帮助?

请帮助我理解.提前致谢.

das*_*ght 18

编写类库的一种常见做法是将传递到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是String可变的,这将导致一个微妙的漏洞:攻击者会传递一个好的URL,等待几微秒,然后将URL设置为指向攻击站点.

由于存储而不进行复制是一种相当普遍的做法,并且由于字符串是最常用的数据类型之一,因此保留字符串可变性会打开许多​​未编写但尚未解决严重安全问题的API.使字符串不可变关闭所有API的特定安全漏洞,包括尚未编写的API.

  • ("部分")可变性的一个很好的例子是`File`.基本上它只是包装一个`String`.但是,在许多情况下,它已被用于安全检查.恶意子类可以在检查和使用之间进行更改(TOCTOU/TOC2TOU漏洞). (2认同)
  • 我不确定微妙的漏洞是如何完成的,但假设该方法将通过另一个线程以某种方式被截获.基本上,因为如果使用urlString"ABC"调用MyApi构造函数,String是不可变的,那么内容不能从构造函数外部更改.如果它不是不可变的,只需调用urlString ="someMaliciousUrl"就可以在另一个线程上进行变异; 在checkApprovedUrl调用之后.这种理解是否正确? (2认同)