ABAP和Java單例模式的攻防-創(chuàng)新互聯(lián)

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.

通過(guò)序列化/反序列化攻擊單例模式:

為南澳等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及南澳網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、南澳網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
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.

ABAP和Java單例模式的攻防

繞過(guò)了單例的限制,構(gòu)造了第二個(gè)實(shí)例。

Java

除了用序列化/反序列化攻擊外,還可以用反射攻擊。

ABAP和Java單例模式的攻防

然而我只需要將這個(gè)單例類JerrySingleton的構(gòu)造函數(shù)通過(guò)反射設(shè)置成可以訪問(wèn)Accessible,然后就能通過(guò)反射調(diào)用該構(gòu)造函數(shù),進(jìn)而生成新的對(duì)象實(shí)例。這樣就破壞了單例模式。

ABAP和Java單例模式的攻防

第6行代碼會(huì)打印false。

針對(duì)這種攻擊,一種可行的防御措施是在單例類的構(gòu)造函數(shù)內(nèi)定義一個(gè)布爾變量,初始化為false。當(dāng)構(gòu)造函數(shù)執(zhí)行后,該變量被置為true。如果接下來(lái)構(gòu)造函數(shù)再次被執(zhí)行,則人為拋出異常,避免構(gòu)造函數(shù)重復(fù)執(zhí)行。

ABAP和Java單例模式的攻防

這種防御措施無(wú)法從根本上杜絕Singleton被攻擊,因?yàn)楣粽呷耘f可以通過(guò)反射來(lái)修改布爾變量flag的值,從而繞過(guò)這個(gè)檢查。

最理想的不會(huì)受到攻擊的單例模式實(shí)現(xiàn)是借助Java里枚舉類Enumeration的特性:

ABAP和Java單例模式的攻防

這種實(shí)現(xiàn)類型的單例模式的消費(fèi)代碼:

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

如果攻擊者通過(guò)前面介紹的反射代碼對(duì)這種實(shí)現(xiàn)方式的單例進(jìn)行攻擊,JDK會(huì)拋出NoSuchMethodException異常:

ABAP和Java單例模式的攻防

究其原因,是因?yàn)楝F(xiàn)在我們是通過(guò)Java枚舉方式實(shí)現(xiàn)的單例,枚舉類沒(méi)有傳統(tǒng)意義上的構(gòu)造函數(shù),因此對(duì)這種反射攻擊免疫。

要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":

當(dāng)前題目:ABAP和Java單例模式的攻防-創(chuàng)新互聯(lián)
鏈接分享:http://muchs.cn/article48/pgshp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、品牌網(wǎng)站制作虛擬主機(jī)軟件開(kāi)發(fā)、網(wǎng)站內(nèi)鏈、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)