我正在为考试做一些个人研究。过去的考试要求概述 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/