专栏首页java一日一条如何防止单例模式被JAVA反射攻击

如何防止单例模式被JAVA反射攻击

单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013256816/article/details/50427061),讲诉了单例模式的四种写法,并指出占位符模式的写法比较ok,详见如下:

但这都是基于一个条件:确保不会通过反射机制调用私有的构造器。 这里举个例子,通过JAVA的反射机制来“攻击”单例模式:

运行结果:false 可以看到,通过反射获取构造函数,然后调用setAccessible(true)就可以调用私有的构造函数,所有e1和e2是两个不同的对象。 如果要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。 经修改后:

测试代码:

运行结果:

可以看到,成功的阻止了单例模式被破坏。 从JDK1.5开始,实现Singleton还有新的写法,只需编写一个包含单个元素的枚举类型。推荐写法:

测试代码:

运行结果:

由此可见这种写法也可以防止单例模式被“攻击”。 而且这种写法也可以防止序列化破坏单例模式,具体不在举例了,有关序列化以及单例模式被序列化破坏可以参考博文《JAVA序列化》(链接:http://blog.csdn.net/u013256816/article/details/50474678)。 单元素的枚举类型已经成为实现Singleton模式的最佳方法。

本文分享自微信公众号 - java一日一条(mjx_java),作者:收听我

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何防止单例模式被JAVA反射攻击

    单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013...

    哲洛不闹
  • InnoDB隔离模式对MySQL性能的影响

    MySQL手册提供了一个关于MySQL支持的事务隔离模式的恰当描述 – 在这里我并不会再重复,而是聚焦到对性能的影响上。

    哲洛不闹
  • 在 Java 中如何使用 transient

    Java语言的transient不像class、synchronized和其他熟悉的关键字那样众所周知,因而它会出现在一些面试题中。这篇文章我将为大家讲解tra...

    哲洛不闹
  • 如何防止单例模式被JAVA反射攻击

    单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013...

    哲洛不闹
  • 3分钟教你搭建 gitea 在 Centos 服务器

    本文告诉大家如何在一个 Centos 服务器上搭建 gitea 然后在 gitea 创建帐号上传代码

    林德熙
  • BlueKeep 漏洞利用分析

    通道的数据包定义在MCS Connect Inittial PDU with GCC Conference Create Request中,在rdp连接过程如下...

    Seebug漏洞平台
  • BlueKeep 漏洞利用分析

    通道的数据包定义在MCS Connect Inittial PDU with GCC Conference Create Request中,在rdp连接过程如下...

    知道创宇云安全
  • 《Head First 设计模式》- 单例模式

    设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关需求扩展极为方便的一个思想。 简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个功...

    聚沙成塔
  • 兔子跳铃铛(记原来写的一个游戏)

    前言     好几年没有写C++代码了,今天朋友问起一个C++的问题,我是怎么也想不起答案来了。哈哈。所以现在把原来在大二时候写过的一个C++游戏先写下来,要不...

    用户1172223
  • C# 基础知识系列- 13 常见类库介绍(二)日期时间类

    上一篇内容介绍了Console类和Math类,这篇内容着重介绍一下C#中时间日期的处理方式。

    程序员小高

扫码关注云+社区

领取腾讯云代金券