Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第32讲 | 如何写出安全的Java代码?

鼓励读者思考并留言讨论
强调了攻击和防守的不对称性
提到JDK自身的软件瑕疵和安全漏洞补丁
探讨了开发和测试阶段的实践
讨论了序列化的安全问题
强调减少暴露敏感信息的原则
提到数值类型需要防范溢出的安全隐患
考察安全问题,除了对特定安全领域知识的考察,更多是要看面试者的Java编程基本功和知识的积累
以典型的DoS攻击作为切入点,聚焦在Java开发中
强调了资源释放的重要性
讨论了哈希碰撞攻击和其他计算密集型任务的安全防范
提到早期的JDK和Applet等技术的安全问题
强调程序级别的攻击和安全代码的必要性
介绍了DoS攻击和Java开发中需要考虑的点
一课一练
部署阶段的安全实践
开发和测试阶段的实践
知识扩展包括条件判断代码、异常处理代码、序列化等
从典型回答和考点分析入手
侧重于Java开发者的角度谈代码安全
今天将探讨更多Java开发中可能影响到安全的场合
上一讲中初步接触了Java安全
标题:如何写出安全的Java代码?
一课一练
知识扩展
考点分析
典型回答
参考文章
如何写出安全的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
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • Len
    在密码使用的场景中,比如用户注册/登录。 我使用 char[] 数组存储和验证密码,并在使用结束后,通过随机的字符覆盖掉 char[]。 如果使用 string 存储密码,由于它的不可变性,它的缺陷是会一直驻留在堆中,直到未来被垃圾回收。

    作者回复: 不错

    2018-07-20
    5
    105
  • 李二木
    最近项目在改安全问题,主要遇到的有:SQL注入,IO流没有关闭,使用不安全Random,重定向Url合法性没做检验,上传文件前后端没做文件大小类型校验。通过反射方式访问私有方法。日志包含敏感信息,没有禁止除GET,POST以外的HTTP请求等等

    作者回复: jdk新版中 random升级很多,例如基于DRBG的实现,值得尝试

    2018-07-19
    2
    26
  • Leiy
    老师,你好,那个c是负数,b是正数,c-b也可能溢出吧?

    作者回复: 对,所以我强调判断数值范围,具体看情况选择

    2018-07-20
    2
    22
  • 郭俊杰
    老师,你好,多线程访问共享数据会有线程安全问题,是不是在方法内部new的对象也一样存在线程安全问题呢?

    作者回复: 需要理解为什么有线程安全问题,看是否线程间共享,不可变还是可修改

    2018-08-18
    3
  • 老韩
    hook有直接可用的或者简单修改就能用的推荐吗

    作者回复: openjdk用的是自身定制的...但我理解主流代码检查工具,都可以试试定制个适合做check-in守门的版本,想清楚限定什么,一般是个子集

    2018-07-19
    3
  • 王大为
    老师,您好,我编译了openjdk,导入到netbeans中,怎么打不了断点调试jdk模块,请您指导下

    作者回复: netbeans…基本没怎么用过,openjdk什么版本?netbeans呢?oracle官方的jdk有这个问题吗? 另外build的时候有没有加上—enable-debug之类参数?

    2018-07-19
    1
  • 程序员小跃
    这节课让我想去以前在菊厂做的各种红线检查,就是针对各种安全来应对的。通过findbugs,pclint,fortify等静待代码检查;安全扫描;Sql注入;Android还有Monkey测试等手段进行安全攻防
    2019-04-08
    8
  • birdzxc
    老师,能否就spring 源码 解读一下呢?非常期待
    2018-07-19
    4
  • 我滴头好大呀
    期待
    2018-07-19
    4
  • 羊羊羊
    安全倾向于 “明显没有漏洞”,而不是“没有明显漏洞”。这段话很喜欢,老师能不能在详细的剖析下这句话。
    2018-07-21
    1
    3
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部