防御性编程是防御式设计的一种形式,用来确保软件在未知的环境中能继续运行。防御性编程的实践往往用于需要高可用性、安全性、保密性的地方。—— 维基百科
Essential security skills for Java developers:
Input handling
Authentication and session management
Access control
Error and exception handling
Encryption services
防御性编程的几条基本规则:
- 保护你的代码不要受“外界”的无效数据影响,“外界”影响有很多种情况。外部系统的数据,某个用户的操作或模型/组件外面的数据。任何在控制范围之外的东西都是危险的,而任何在控制范围之内的都是安全的,所以要设立“安全区”。在安全区域的代码会验证所有的输入数据:检查所有输入参数的类型,长度和取值范围。可以通过双击来检测有没有溢出。
- 当检验到了错误的数据后,可以考虑如何处理它。防御性编程并不意味着要忍受错误或是避开错误。它意味着要从健壮性(如果遇到你能处理的问题时能保持程序运行)和正确性(不会返回错误的结果)之间权衡最合适的处理方式。可以选择一种策略来处理错误的数据:报错并立刻停止程序(快速结束),返回一个替代的数据值,等等,总之要确保这个策略是明显一致的。
- 不要以为在代码外进行函数调用和方法调用会像你所想的那般顺利。你要明白这一点,并在外部的API和库里测试你的错误处理。
- 在开发和测试的情况下,可以使用断言来假设某种“可能出现”的条件并特别显示出来。这对于需要不同的人在各个时间进行维护的高可靠性大型系统来说尤其重要。
- 添加诊断代码可以智能记录并追踪代码,它可以解释运行时当前的情况,尤其在遇到某个问题时它的帮助会更大。
- 错误处理需要标准化。要考虑遇到“一般错误”、“预料中错误”和警告时的各种处理方式,决定好之后就不要再改了。
- 只有在你需要的时候,并且你对编程语言的异常处理极为熟悉才可以使用异常处理。