摘要:然而我只需要將這個單例類的構造函數通過反射設置成可以訪問,然后就能通過反射調用該構造函數,進而生成新的對象實例。針對這種攻擊,一種可行的防御措施是在單例類的構造函數內定義一個布爾變量,初始化為。當構造函數執行后,該變量被置為。
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. *---------------------------------------------------------------------------------------+ * | Static Public Method ZCL_JERRY_SINGLETON=>CLASS_CONSTRUCTOR * +-------------------------------------------------------------------------------------------------+ * +-------------------------------------------------------------------------------------- METHOD class_constructor. so_instance = NEW zcl_jerry_singleton( ). ENDMETHOD. *---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_JERRY_SINGLETON->CONSTRUCTOR * +-------------------------------------------------------------------------------------------------+ * +-------------------------------------------------------------------------------------- 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. *---------------------------------------------------------------------------------------+ * | Static Public Method ZCL_JERRY_SINGLETON=>GET_INSTANCE * +-------------------------------------------------------------------------------------------------+ * | [<-()] RO_INSTANCE TYPE REF TO ZCL_JERRY_SINGLETON * +-------------------------------------------------------------------------------------- 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的原創文章,請關注公眾號"汪子熙":
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71933.html
摘要:本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進行詳細的剖析與解答。敬請關注服務端思維微信公眾號,獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結合自己過往的面試經驗,整理了一些核心的知識清單,幫助讀者更好地回顧與復習 Java 服務端核心技術。本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進...
摘要:這是年的第篇文章,也是汪子熙公眾號總共第篇原創文章。使用通過格式發送和文件到服務器關于格式的詳細說明,參考開發社區和的文檔我在前文例子的基礎上稍作修改在里使用兩個類型為的標簽,分別上傳和文件用來測試的本地文件,大小為字節。 這是 Jerry 2021 年的第 71 篇文章,也是汪子熙公眾號總共第 348 篇原創文章。 Jerry 之前發布過一篇文章 不使用任何框架,手寫純 Jav...
摘要:目前被廣泛用于和的眾多應用中,以及和一些正在開發的新一代云產品中。年月時,我和德國一位負責的同事就這個話題在半小時的電話會議里產生了爭執。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協議是一個開放的工業標準,用于定義RESTFul API的設計和使用。我的文章標題前加上SAP的前綴...
摘要:目前被廣泛用于和的眾多應用中,以及和一些正在開發的新一代云產品中。年月時,我和德國一位負責的同事就這個話題在半小時的電話會議里產生了爭執。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協議是一個開放的工業標準,用于定義RESTFul API的設計和使用。我的文章標題前加上SAP的前綴...
閱讀 1773·2021-10-11 10:59
閱讀 2418·2021-09-30 09:53
閱讀 1782·2021-09-22 15:28
閱讀 2807·2019-08-29 15:29
閱讀 1570·2019-08-29 13:53
閱讀 3219·2019-08-29 12:34
閱讀 2866·2019-08-26 10:16
閱讀 2675·2019-08-23 15:16