我一直在处理代码审计,像这样的安全分析和道德黑客攻击已经运行了十五年了,所以让我分享一些我的经验。
我所看到的每一位老板和团队领导都坚持对代码质量有高标准,这不仅是为了让代码审查更容易,而且也是为了稳定性、可维护性和安全性。像您的团队一样进行异常处理的开发人员要么没有经验,要么没有时间,要么根本不在乎。而这种懒惰的编码会导致灾难。
对我来说最明显的是你的问题 3,一个空的捕获。这掩盖了通过它的任何错误,甚至没有记录它。现在假设发生以下情况:
try {
// start a transaction
} catch (Exception ex) {
}
finally {
// commit the transaction
}
您可能会将对业务无效的数据放入数据库中。对于更详细的示例,假设具有属性的Account类型fund,这样fund是一个无符号整数(因为您不希望允许其中的资金少于零的帐户):
try {
// moving funds between accounts
Transaction.start();
accountA.funds += amount;
accountB.funds -= amount; // throws an overflow exception if funds < amount
} catch (Exception ex) {
}
finally {
Transaction.commit();
}
最终结果可能是资金流向账户 A,但不会从账户 B 中扣除。
这听起来可能很愚蠢,对你来说不符合你的团队,但我不得不在我工作过的一些公司处理遗留代码中的这些事情。我并不是说您的解决方案中包含这种代码,但我是说如果您有懒惰或心怀不满的员工,发现这样的代码不要感到惊讶。如果你得到一份像你所做的那样的报告,永远不要相信你的代码库是完全安全的。
让我先一步,举一个例子,在这个例子中,糟糕的错误处理确实让很多人感到厌烦。历史上最昂贵的编码错误之一是阿丽亚娜 5 号火箭的首次试飞。
1996 年 6 月 4 日,阿丽亚娜 5 号的首次试飞(阿丽亚娜 5 号航班 501)失败,由于控制软件故障,火箭在发射后 37 秒自毁。将数据从 64 位浮点值转换为 16 位有符号整数值以存储在表示水平偏差的变量中导致处理器陷阱(操作数错误),因为浮点值太大而无法用 16 位表示有符号整数。该软件最初是为 Ariane 4 编写的,考虑到效率(运行该软件的计算机有 80% 的最大工作负载要求)导致四个变量受到处理程序的保护,而其他三个变量,包括水平偏差变量,没有受到保护,因为人们认为他们“身体受到限制或有很大的安全余地”。
强调我的。如果我没记错的话,那是 3.7 亿美元的失败。诚然,您可能不是为 NASA 或 DARPA 编码,因此您因编码错误而造成的损失应该主要是由于返工而不是机器爆炸造成的员工时间。但是损失同样是损失,如果你可以通过更加小心来避免它们,你最好至少考虑一下。