ABAP和Java单例模式的攻防

ABAP

CLASS zcl_jerry_singleton DEFINITION

PUBLIC

FINAL

CREATE PRIVATE .

PUBLIC SECTION.

INTERFACES if_serializable_object .

CLASS-METHODS class_constructor .

CLASS-METHODS get_instance

RETURNING

VALUE(ro_instance) TYPE REF TO zcl_jerry_singleton .

PROTECTED SECTION.

PRIVATE SECTION.

CLASS-DATA so_instance TYPE REF TO zcl_jerry_singleton .

DATA mv_name TYPE string .

DATA mv_initialized TYPE abap_bool .

METHODS constructor .

ENDCLASS.

CLASS ZCL_JERRY_SINGLETON IMPLEMENTATION.

* <SIGNATURE>---------------------------------------------------------------------------------------+

* | Static Public Method ZCL_JERRY_SINGLETON=>CLASS_CONSTRUCTOR

* +-------------------------------------------------------------------------------------------------+

* +--------------------------------------------------------------------------------------</SIGNATURE>

METHOD class_constructor.

so_instance = NEW zcl_jerry_singleton( ).

ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+

* | Instance Public Method ZCL_JERRY_SINGLETON->CONSTRUCTOR

* +-------------------------------------------------------------------------------------------------+

* +--------------------------------------------------------------------------------------</SIGNATURE>

METHOD constructor.

mv_name = 'Jerry'.

IF mv_initialized = abap_false.

mv_initialized = abap_true.

ELSE.

MESSAGE 'you are in trouble!' TYPE 'E' DISPLAY LIKE 'I'.

ENDIF.

ENDMETHOD.

* <SIGNATURE>---------------------------------------------------------------------------------------+

* | Static Public Method ZCL_JERRY_SINGLETON=>GET_INSTANCE

* +-------------------------------------------------------------------------------------------------+

* | [<-()] RO_INSTANCE TYPE REF TO ZCL_JERRY_SINGLETON

* +--------------------------------------------------------------------------------------</SIGNATURE>

METHOD get_instance.

ro_instance = so_instance.

ENDMETHOD.

ENDCLASS.

通过序列化/反序列化攻击单例模式:

DATA(lo_instance) = zcl_jerry_singleton=>get_instance( ).

DATA: s TYPE string.

CALL TRANSFORMATION id SOURCE model = lo_instance RESULT XML s.

DATA: lo_instance2 TYPE REF TO zcl_jerry_singleton.

CALL TRANSFORMATION id SOURCE XML s RESULT model = lo_instance2.

绕过了单例的限制,构造了第二个实例。

Java

除了用序列化/反序列化攻击外,还可以用反射攻击。

然而我只需要将这个单例类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。这样就破坏了单例模式。

第6行代码会打印false。

针对这种攻击,一种可行的防御措施是在单例类的构造函数内定义一个布尔变量,初始化为false。当构造函数执行后,该变量被置为true。如果接下来构造函数再次被执行,则人为抛出异常,避免构造函数重复执行。

这种防御措施无法从根本上杜绝Singleton被攻击,因为攻击者仍旧可以通过反射来修改布尔变量flag的值,从而绕过这个检查。

最理想的不会受到攻击的单例模式实现是借助Java里枚举类Enumeration的特性:

这种实现类型的单例模式的消费代码:

System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());

如果攻击者通过前面介绍的反射代码对这种实现方式的单例进行攻击,JDK会抛出NoSuchMethodException异常:

究其原因,是因为现在我们是通过Java枚举方式实现的单例,枚举类没有传统意义上的构造函数,因此对这种反射攻击免疫。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT开发技术与工作效率

一些容易忽略的Java基础题

Oracle 在 DDL 前后各执行一次 COMMIT,所以慎用 truncate

963
来自专栏吴伟祥

字段规范 原

561
来自专栏一“技”之长

AppleWatch开发入门四——Table视图的应用

        WatchOS中的TableView和iOS中的TableView还是有很大的区别,在开发之前,首先我们应该明白WatchOS中的Table有哪...

1072
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

3054
来自专栏别先生

Hibernate的核心对象关系映射

Hibernate的核心就是对象关系映射: 加载映射文件的两种方式:   第一种:<mapping resource="com/bie/lesson02/c...

2426
来自专栏chenssy

【死磕Sharding-jdbc】---数据源

以 com.dangdang.ddframe.rdb.sharding.example.jdbc.Main剖析分库分表配置与实现,其部分源码如下:

1361
来自专栏nice_每一天

Elasticsearch JavaApi

 官网JavaApi地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/curre...

7134
来自专栏Greenplum

Greenplum 对JSON的支持

源文章:http://www.postgresqltutorial.com/postgresql-json/

851
来自专栏跟着阿笨一起玩NET

EF Code First 学习笔记:关系

项目中最常用到的就是一对多关系了。Code First对一对多关系也有着很好的支持。很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性...

1741
来自专栏cloudskyme

一步一步学lucene——(第三步:索引篇)

在前面概要的了解了lucene的内容下面就深入一下lucene的各个模块。这里我们主要深入一下lucene的索引,就是如何构建索引的过程及概念。 lucene与...

4066

扫码关注云+社区

领取腾讯云代金券