第32讲 | 如何写出安全的Java代码?
杨晓峰
该思维导图由 AI 生成,仅供参考
在上一讲中,我们已经初步接触了 Java 安全,今天我们将一起探讨更多 Java 开发中可能影响到安全的场合。很多安全问题,在特定的上下文,存在着不同的定义,尽管本质是相似或一致的,这是由于 Java 平台自身的特性所带来特有的问题。今天这一讲我将侧重于 Java 开发者的角度谈代码安全,而不是讲广义的安全风险。
今天我要问你的问题是,如何写出安全的 Java 代码?
典型回答
这个问题可能有点宽泛,我们可以用特定类型的安全风险为例,如拒绝服务(DoS)攻击,分析 Java 开发者需要重点考虑的点。
DoS 是一种常见的网络攻击,有人也称其为“洪水攻击”。最常见的表现是,利用大量机器发送请求,将目标网站的带宽或者其他资源耗尽,导致其无法响应正常用户的请求。
我认为,从 Java 语言的角度,更加需要重视的是程序级别的攻击,也就是利用 Java、JVM 或应用程序的瑕疵,进行低成本的 DoS 攻击,这也是想要写出安全的 Java 代码所必须考虑的。例如:
如果使用的是早期的 JDK 和 Applet 等技术,攻击者构建合法但恶劣的程序就相对容易,例如,将其线程优先级设置为最高,做一些看起来无害但空耗资源的事情。幸运的是类似技术已经逐步退出历史舞台,在 JDK 9 以后,相关模块就已经被移除。
上一讲中提到的哈希碰撞攻击,就是个典型的例子,对方可以轻易消耗系统有限的 CPU 和线程资源。从这个角度思考,类似加密、解密、图形处理等计算密集型任务,都要防范被恶意滥用,以免攻击者通过直接调用或者间接触发方式,消耗系统资源。
利用 Java 构建类似上传文件或者其他接受输入的服务,需要对消耗系统内存或存储的上限有所控制,因为我们不能将系统安全依赖于用户的合理使用。其中特别注意的是涉及解压缩功能时,就需要防范Zip bomb等特定攻击。
另外,Java 程序中需要明确释放的资源有很多种,比如文件描述符、数据库连接,甚至是再入锁,任何情况下都应该保证资源释放成功,否则即使平时能够正常运行,也可能被攻击者利用而耗尽某类资源,这也算是可能的 DoS 攻击来源。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文从Java开发者的角度探讨了编写安全的Java代码的重要性,并聚焦于DoS攻击对Java应用设计和实现的影响。作者指出,安全的Java代码需要充分考虑功能设计到实现细节可能带来的安全影响,特别强调了程序级别的攻击,如利用Java、JVM或应用程序的瑕疵进行低成本的DoS攻击。文章还提到了一些常见的安全风险,如早期的JDK和Applet技术可能存在的问题,哈希碰撞攻击、计算密集型任务的防范、上传文件服务的安全控制等。作者表示将在后续文章中逐步探讨Java安全编程,强调了安全问题实际上是软件的缺陷,需要在设计、架构、编码、测试等阶段进行安全实践。总的来说,本文以DoS攻击为切入点,聚焦在Java开发中的安全问题,强调了安全编程需要规范的开发标准和认真对待的态度。文章还介绍了在开发和测试阶段以及部署阶段的安全实践建议,包括代码规约标准、静态分析工具的使用、JDK版本的升级等。通过对安全编程细节的讨论,读者可以更好地了解Java安全编程的重要性和实践方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》,新⼈⾸单¥59
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
登录 后留言
全部留言(18)
- 最新
- 精选
- Len在密码使用的场景中,比如用户注册/登录。 我使用 char[] 数组存储和验证密码,并在使用结束后,通过随机的字符覆盖掉 char[]。 如果使用 string 存储密码,由于它的不可变性,它的缺陷是会一直驻留在堆中,直到未来被垃圾回收。
作者回复: 不错
2018-07-205105 - 李二木最近项目在改安全问题,主要遇到的有:SQL注入,IO流没有关闭,使用不安全Random,重定向Url合法性没做检验,上传文件前后端没做文件大小类型校验。通过反射方式访问私有方法。日志包含敏感信息,没有禁止除GET,POST以外的HTTP请求等等
作者回复: jdk新版中 random升级很多,例如基于DRBG的实现,值得尝试
2018-07-19226 - Leiy老师,你好,那个c是负数,b是正数,c-b也可能溢出吧?
作者回复: 对,所以我强调判断数值范围,具体看情况选择
2018-07-20222 - 郭俊杰老师,你好,多线程访问共享数据会有线程安全问题,是不是在方法内部new的对象也一样存在线程安全问题呢?
作者回复: 需要理解为什么有线程安全问题,看是否线程间共享,不可变还是可修改
2018-08-183 - 老韩hook有直接可用的或者简单修改就能用的推荐吗
作者回复: openjdk用的是自身定制的...但我理解主流代码检查工具,都可以试试定制个适合做check-in守门的版本,想清楚限定什么,一般是个子集
2018-07-193 - 王大为老师,您好,我编译了openjdk,导入到netbeans中,怎么打不了断点调试jdk模块,请您指导下
作者回复: netbeans…基本没怎么用过,openjdk什么版本?netbeans呢?oracle官方的jdk有这个问题吗? 另外build的时候有没有加上—enable-debug之类参数?
2018-07-191 - 程序员小跃这节课让我想去以前在菊厂做的各种红线检查,就是针对各种安全来应对的。通过findbugs,pclint,fortify等静待代码检查;安全扫描;Sql注入;Android还有Monkey测试等手段进行安全攻防2019-04-088
- birdzxc老师,能否就spring 源码 解读一下呢?非常期待2018-07-194
- 我滴头好大呀期待2018-07-194
- 羊羊羊安全倾向于 “明显没有漏洞”,而不是“没有明显漏洞”。这段话很喜欢,老师能不能在详细的剖析下这句话。2018-07-2113
收起评论