如何写出安全的Java代码?
在上一讲中,我们已经初步接触了Java安全,今天我们将一起探讨更多Java开发中可能影响到安全的场合。很多安全问题,在特定的上下文,存在着不同的定义,尽管本质是相似或一致的,这是由于Java平台自身的特性所带来特有的问题。今天这一讲我将侧重于Java开发者的角度谈代码安全,而不是讲广义的安全风险
今天我要问你的问题是,如何写出安全的Java代码?
典型回答
- 这个问题可能有点宽泛,我们可以用特定类型的安全风险为例,如拒绝服务(DoS)攻击,分析Java开发者需要重点考虑的点
- DoS是一种常见的网络攻击,有人也称其为“洪水攻击”。最常见的表现是,利用大量机器发送请求,将目标网站的带宽或者其他资源耗尽,导致其无法响应正常用户的请求
- 我认为,从Java语言的角度,更加需要重视的是程序级别的攻击,也就是利用Java、JVM或应用程序的瑕疵,进行低成本的DoS攻击,这也是想要写出安全的Java代码所必须考虑的。例如:
- 如果使用的是早期的JDK和Applet等技术,攻击者构建合法但恶劣的程序就相对容易,例如,将其线程优先级设置为最高,做一些看起来无害但空耗资源的事情。幸运的是类似技术已经逐步退出历史舞台,在JDK 9以后,相关模块就已经被移除
- 上一讲中提到的哈希碰撞攻击,就是个典型的例子,对方可以轻易消耗系统有限的CPU和线程资源。从这个角度思考,类似加密、解密、图形处理等计算密集型任务,都要防范被恶意滥用,以免攻击者通过直接调用或者间接触发方式,消耗系统资源
- 利用Java构建类似上传文件或者其他接受输入的服务,需要对消耗系统内存或存储的上限有所控制,因为我们不能将系统安全依赖于用户的合理使用。其中特别注意的是涉及解压缩功能时,就需要防范Zip bomb等特定攻击
- 另外,Java程序中需要明确释放的资源有很多种,比如文件描述符、数据库连接,甚至是再入锁,任何情况下都应该保证资源释放成功,否则即使平时能够正常运行,也可能被攻击者利用而耗尽某类资源,这也算是可能的DoS攻击来源
- 所以可以看出,实现安全的Java代码,需要从功能设计到实现细节,都充分考虑可能的安全影响
考点分析
- 其实安全问题实际就是软件的缺陷,软件安全并不存在一劳永逸的秘籍,既离不开设计、架构中的风险分析,也离不开编码、测试等阶段的安全实践手段。对于面试官来说,考察安全问题,除了对特定安全领域知识的考察,更多是要看面试者的Java编程基本功和知识的积累
- 所以,我会在后面会循序渐进探讨Java安全编程,这里面没有什么黑科技,只有规范的开发标准,很多安全问题其实是态度问题,取决于你是否真的认真对待它
|