91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ABAP和Java單例模式的攻防

發布時間:2020-08-08 18:03:20 來源:ITPUB博客 閱讀:116 作者:i042416 欄目:編程語言

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.

ABAP和Java單例模式的攻防

繞過了單例的限制,構造了第二個實例。

Java

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

ABAP和Java單例模式的攻防

然而我只需要將這個單例類JerrySingleton的構造函數通過反射設置成可以訪問Accessible,然后就能通過反射調用該構造函數,進而生成新的對象實例。這樣就破壞了單例模式。

ABAP和Java單例模式的攻防

第6行代碼會打印false。

針對這種攻擊,一種可行的防御措施是在單例類的構造函數內定義一個布爾變量,初始化為false。當構造函數執行后,該變量被置為true。如果接下來構造函數再次被執行,則人為拋出異常,避免構造函數重復執行。

ABAP和Java單例模式的攻防

這種防御措施無法從根本上杜絕Singleton被攻擊,因為攻擊者仍舊可以通過反射來修改布爾變量flag的值,從而繞過這個檢查。

最理想的不會受到攻擊的單例模式實現是借助Java里枚舉類Enumeration的特性:

ABAP和Java單例模式的攻防

這種實現類型的單例模式的消費代碼:

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

如果攻擊者通過前面介紹的反射代碼對這種實現方式的單例進行攻擊,JDK會拋出NoSuchMethodException異常:

ABAP和Java單例模式的攻防

究其原因,是因為現在我們是通過Java枚舉方式實現的單例,枚舉類沒有傳統意義上的構造函數,因此對這種反射攻擊免疫。

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正宁县| 垫江县| 娄底市| 德州市| 凭祥市| 兴文县| 油尖旺区| 深泽县| 包头市| 体育| 斗六市| 巴中市| 惠来县| 南京市| 宁强县| 上犹县| 东乌珠穆沁旗| 怀宁县| 伊吾县| 凤凰县| 富裕县| 桂东县| 沧州市| 大田县| 临泽县| 文化| 昌平区| 金寨县| 青州市| 玛纳斯县| 容城县| 临安市| 屯昌县| 古蔺县| 长垣县| 咸丰县| 社旗县| 清河县| 黄平县| 武陟县| 巧家县|