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的原创文章,请关注公众号"汪子熙":
相关推荐
输入WSDL URL并完成生成,这将创建一系列ABAP类和接口,用于与Java Web Service通信。 5. **生成Port和实例调用** 生成代理后,需要创建一个Port实例,这个实例是实际调用Web Service的载体。在ABAP代码中,通过...
通过配置JCo服务器程序以及编写相应的ABAP和JAVA代码,可以实现跨系统的数据传输和处理功能。这对于集成不同技术平台的应用系统来说是非常重要的技术手段之一。此外,本案例还强调了在开发过程中需要注意的一些细节...
综上所述,《ABAP Objects for Java Developers》是一份极具价值的参考资料,它不仅介绍了ABAP的核心概念和技术细节,还强调了ABAP与Java之间的相似性,这对于Java开发者来说是非常有用的。通过学习这份资料,开发者...
总的来说,"ABAP调用函数自动填充模式"是提高ABAP编程效率的一种技术,它利用了编辑器的智能提示和扩展功能,帮助开发人员快速、准确地编写函数调用。通过理解这些概念和相关的代码资源,我们可以更好地利用SAP ABAP...
在IT领域,尤其是在企业级应用开发中,Java和ABAP(Advanced Business Application Programming)是两种常用的编程语言。Java广泛应用于互联网应用,而ABAP则是SAP系统的核心编程语言。为了实现不同系统的集成和数据...
Java与SAP ABAP之间的通信主要通过Remote Function Call (RFC)接口实现,这是一种标准化的方式,允许不同系统间的双向数据交换。在本项目中,我们使用了JCo3(Java Connector version 3)库,它是SAP提供的Java API...
标题中的“ABAP-AES-JAVA加密解密”是指在ABAP和JAVA两个不同的编程环境中实现AES(Advanced Encryption Standard)加密算法的互操作性。AES是一种广泛应用的块密码标准,用于保护数据的安全,确保信息不被未经授权...
SAP(Systems, Applications, and Products in Data Processing)是全球知名的ERP(企业资源规划)解决方案提供商,ABAP(Advanced Business Application Programming)和JAVA是SAP系统中常用的编程语言。...
ABAP的另一个显著特性是其跨平台性,类似于Java,ABAP程序可以在任何操作系统上运行,兼容多种数据库,并能在不同的网络系统中无缝运行。ABAP字典实现了透明表的概念,使得开发者在ABAP层面上操作的表与底层数据库...
"如何在后台模式下调试程序ABAP程序的运行" ABAP程序调试是SAP系统中的一种重要功能,用于检测和解决程序中的错误。后台调试是ABAP程序调试的一种方式,指的是在后台模式下调试程序的运行。下面我们将详细介绍如何...
2. **生成Proxy代码**:在目标系统中,使用SE80事务码,通过“生成ABAP Proxy”功能,输入源系统的服务接口信息,自动生成对应的ABAP Proxy类和相关代码。 3. **编译与激活**:生成的Proxy代码需要在目标系统中进行...
JCO提供了与SAP Remote Function Call (RFC)接口的连接,使得非SAP系统(例如Java应用)可以调用SAP的BAPIs(Business Application Programming Interfaces)和自定义RFC函数模块。 描述中提到的"jco3.0.5"是指SAP ...
"abap xlsx2 demo 程序"是一个示例项目,旨在展示如何在SAP系统中读取和写入Excel文件。在这个程序中,开发者可能使用了特定的库或者自定义开发的函数来实现与Excel的交互。 首先,要理解ABAP如何处理.xlsx文件,...
ABAP 4.7引入了类和对象的概念,支持继承、封装和多态性,这使得代码可维护性和复用性大大提升。 5. 功能模块和库: 功能模块是预定义的程序单元,可以被其他程序调用。ABAP库则包含一组相关功能模块,用于特定的...
SAP ABAP 开发环境和开发工具介绍 SAP ABAP 开发环境和开发工具是 SAP 系统中最重要的组件之一,它提供了一个强大的开发平台,允许开发者创建、测试和部署 ABAP 程序。ABAP 是 SAP 系统中的主要编程语言,用于开发...
在ABAP编程中,加密和解密是两个关键的安全操作,用于保护敏感数据不被未经授权的用户访问。本文将深入探讨ABAP环境下的加密和解密技术,以及如何在实际应用中实施这些技术。 首先,我们需要理解加密的基本原理。...
在ABAP中,ALV(ABAP List Viewer)是一种强大的工具,用于显示和处理数据表。ALV提供了一种标准化的方式来展示表格数据,包括排序、过滤、分组和自定义列等功能,极大地简化了用户界面的开发。 标题“abap-ALV.rar...
在ABAP和JAVA之间传递数据时,可以使用RFC调用来实现。在ABAP端,定义一个RFC函数模块,封装需要传递的数据和处理逻辑;在JAVA端,使用JCo(Java Connector)库来调用这个RFC。通过这种方式,SAP系统可以与其他非SAP...