Java,部分初始化对象利用的目的是什么

标签 java security

我正在为考试做一些个人研究。过去的考试要求概述 Java 中部分初始化的对象如何容易受到攻击。另外,有人利用您的应用程序中的所述对象可能会出现哪些复杂情况

现在,我在这里找到了这个资源:securecoding.cert

在上面的网站上,我可以看到有关其如何完成的示例,但我似乎无法看到或理解它的目的,您实际上可以用这些对象恶意做什么。

据我了解,在执行操作(例如 boolean 值或类似操作)时,您应该始终检查对象实例化是否已完成,如下所示;

class BankAccount {
  private int balance; // Defaults to 0
  private volatile boolean initialized = false;

  public BankAccount() {
    if (!performAccountVerification()) {
      throw new SecurityException("Invalid Account");
    }
    balance = 1000;  
    // ...
    initialized = true;
  }

  public int getBalance() {
    if (!initialized) {
      throw new IllegalStateException("Class not initialized");
    }
    return balance;
  }
  // ...
}

代码取自上述资源。

您还应该使用 volatile,因为您想确保同步,因为部分问题是 Java 内存允许其他线程访问这些部分初始化的对象。

总结一下:

  • 您为什么要这样做?
  • 您实际上可以用这些对象做什么
  • 您应该始终关注这一点,还是仅在关键系统中关注这一点?

谢谢, 克里斯。

最佳答案

好吧,如果我无权访问银行帐户,并且您的类没有检查 initialized 标志,理论上我可以执行以下操作:

class Thief extends Thread {
    public BankAccount ba = null;
    void run() {
        do { 
            if(ba != null) ba.transferAllMoneyToDima();           
        } while(ba == null);
    }
}

Thief th = new Thief();
th.start();
th.ba = new BankAccount();

这里发生的是,BankAccount 构造函数应该验证我是否有权访问该帐户,如果没有,则抛出异常。优化器允许对某些操作重新排序。特别是,它可以在分配对象后、构造函数完成之前立即将对象分配给 th.ba。如果发生这种情况,我的 Thief 线程将看到非空值,并在验证完成之前窃取金钱,并确定我不应该被允许这样做。

关于Java,部分初始化对象利用的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868607/

相关文章:

android - 安全网络传输的最佳实践

php - Bing Search、Imgur 和 Reddit 等网站如何根据 URL 生成网站缩略图?

java - 如何使用 SecureRandom.getInstanceStrong() 生成 key ?

apache - 阻止 .htaccess 中的 IP 地址有多安全?

java - 如何将未设置的属性映射到值而不在 Dozer 中出现 NullPointerException

java - 如果增加迭代次数,顺序流比并行流更快

java - 在 Java 中使用 jSlider 更改音频输出的音量

java - 当我尝试插入数据时,executeQuery() 不起作用?

java - 如何支持SAML进行用户身份验证

java - JFileChooser.FILES_ONLY 获取文件和目录