国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ABAP和Java單例模式的攻防

alanoddsoff / 521人閱讀

摘要:然而我只需要將這個(gè)單例類的構(gòu)造函數(shù)通過(guò)反射設(shè)置成可以訪問(wèn),然后就能通過(guò)反射調(diào)用該構(gòu)造函數(shù),進(jìn)而生成新的對(duì)象實(shí)例。針對(duì)這種攻擊,一種可行的防御措施是在單例類的構(gòu)造函數(shù)內(nèi)定義一個(gè)布爾變量,初始化為。當(dāng)構(gòu)造函數(shù)執(zhí)行后,該變量被置為。

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.

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

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.

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

Java

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

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

第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í)行。

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

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

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

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

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

究其原因,是因?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)"汪子熙":

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71933.html

相關(guān)文章

  • Java面試通關(guān)要點(diǎn)匯總集

    摘要:本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)行詳細(xì)的剖析與解答。敬請(qǐng)關(guān)注服務(wù)端思維微信公眾號(hào),獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結(jié)合自己過(guò)往的面試經(jīng)驗(yàn),整理了一些核心的知識(shí)清單,幫助讀者更好地回顧與復(fù)習(xí) Java 服務(wù)端核心技術(shù)。本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)...

    gougoujiang 評(píng)論0 收藏0
  • #私藏項(xiàng)目實(shí)操分享# 使用 JavaScript 上傳 PDF Excel 等二進(jìn)制文件到 AB

    摘要:這是年的第篇文章,也是汪子熙公眾號(hào)總共第篇原創(chuàng)文章。使用通過(guò)格式發(fā)送和文件到服務(wù)器關(guān)于格式的詳細(xì)說(shuō)明,參考開發(fā)社區(qū)和的文檔我在前文例子的基礎(chǔ)上稍作修改在里使用兩個(gè)類型為的標(biāo)簽,分別上傳和文件用來(lái)測(cè)試的本地文件,大小為字節(jié)。 這是 Jerry 2021 年的第 71 篇文章,也是汪子熙公眾號(hào)總共第 348 篇原創(chuàng)文章。 Jerry 之前發(fā)布過(guò)一篇文章 不使用任何框架,手寫純 Jav...

    peixn 評(píng)論0 收藏0
  • SAP OData編程指南

    摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時(shí),我和德國(guó)一位負(fù)責(zé)的同事就這個(gè)話題在半小時(shí)的電話會(huì)議里產(chǎn)生了爭(zhēng)執(zhí)。德國(guó)同事看了之后,同意了我的意見。和微信集成系列教程這個(gè)系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協(xié)議是一個(gè)開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計(jì)和使用。我的文章標(biāo)題前加上SAP的前綴...

    X1nFLY 評(píng)論0 收藏0
  • SAP OData編程指南

    摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時(shí),我和德國(guó)一位負(fù)責(zé)的同事就這個(gè)話題在半小時(shí)的電話會(huì)議里產(chǎn)生了爭(zhēng)執(zhí)。德國(guó)同事看了之后,同意了我的意見。和微信集成系列教程這個(gè)系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協(xié)議是一個(gè)開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計(jì)和使用。我的文章標(biāo)題前加上SAP的前綴...

    wanghui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<