博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试刷题28:如何写出安全的java代码?
阅读量:4211 次
发布时间:2019-05-26

本文共 1242 字,大约阅读时间需要 4 分钟。

防护口罩

对jdk,jvm,java应用程序的攻击多种多样?那么从java程序员的角度,如何写出安全的代码呢?

我是李福春,我在准备面试,今天的题目是:如何写出安全的java代码?

答:这个需要从功能设计到实现细节综合考虑,所谓的不安全,是攻击者利用jdk,jvm,java应用程序的瑕疵,或者是架构设计的缺陷进行攻击。

以dos攻击作为例子,分析一下如何写出安全的java代码。

dos攻击是攻击者利用大量的机器发送请求,把目标java应用的的带宽或者其它资源(cpu,内存,磁盘)耗尽,导致正常用户无法正常访问。攻击方式举例如下:

1,早期的jdk版本,利用可以设置线程的优先级,攻击者让大量线程做一些消耗资源的事情,这个可以通过升级jdk版本解决。

2,一些网站的cpu密集型接口没有限制用户的使用,攻击者滥用这些接口,耗尽cpu资源;解决方法:限制用户使用cpu密集型的接口频率或者时间。

3,文件上传没有限制,攻击者会耗尽系统的内存和外存;解决方法:限制用户的文件上传次数和频率

4,其它资源的消耗,比如文件描述符,数据库连接,再入锁没有及时释放,解决办法:显示释放资源,try-finally;

安全代码

在开发阶段指定安全代码的规范,可以参考ali的java规范手册。下面举几个例子说明一下安全问题的出现场景。

防止数值类型溢出

// a, b, c都是int类型的数值if (a + b < c) {// …}

改进

if (a < c – b)

避免暴露敏感信息

try {// 业务代码} catch (Exception e) {throw new RuntimeException(hostname + port + “ doesn’t response”);

改进:不输出敏感信息到异常中;

序列化

序列化一般出现在系统之间信息交换的场景,主要避免敏感数据的泄露。

1,发送出去的时候,对敏感字段增加transiant字段保护起来,防止被序列化;

2,接受信息的时候,在readObject方法中药实现相同的安全和数据检查;

开发完成之后,可以使用相关的插件进行代码扫描,比如findbugs,第一时间发现可能的安全漏洞,修复不安全的代码段。

也可以结合团队安全部门的规范和工具放代码质量扫描系统,比如sonar;

部署java程序之后,要针对使用的jdk版本,及时的更新jdk的版本,升级版本自动的修复了很多针对java的漏洞;

小结

本篇回答了java的攻击产生的主要原因,然后以dos攻击威力,列举了几种攻击的情况。

结合软件研发的生命周期,在不同的阶段给出了一些写出安全java代码保证java应用安全的工具和建议。

小结脑图

原创不易,点赞关注支持一下吧!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。 我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!

你可能感兴趣的文章
0116 spring的webFlux
查看>>
解决 Asp.net 中,url传参乱码 方法之一:(UrlDecode)
查看>>
pdf的转换网址:
查看>>
c++设计模式之三~抽象工厂模式
查看>>
c++设计模式之单例模式
查看>>
c++设计模式之建造者模式
查看>>
c++设计模式之原型模式
查看>>
c++设计模式之适配器模式
查看>>
c++设计模式之桥接模式
查看>>
c++设计模式之装饰模式
查看>>
Mysql学习笔记(八)- 两个简单实用的优化方法
查看>>
mysql学习笔记(九)- 增删改查的优化
查看>>
Jenkins学习笔记(一)
查看>>
AtomicInteger源码解析
查看>>
CopyOnWriteArraySet源码学习
查看>>
ThreadLocal学习笔记
查看>>
用talib实现基于emv的简易量化投资策略
查看>>
LongAdder源码解析
查看>>
Talib学习笔记(二)- 价格指数学习
查看>>
CAS机制是什么?
查看>>