這篇文章主要講解了“ABAP和Java里的單例模式攻擊實例”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ABAP和Java里的單例模式攻擊實例”吧!
創新互聯專注于和平網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供和平營銷型網站建設,和平網站制作、和平網頁設計、和平網站官網定制、微信小程序開發服務,打造和平網絡公司原創品牌,更為您提供和平網站排名全網營銷落地服務。面向對象編程世界里的單例模式(Singleton)可能是設計模式里最簡單的一種,大多數開發人員都覺得可以很容易掌握它的用法。單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
然而在某些場景下,這種設計模式的單例特性會被破壞,看下面這個例子:
代碼的第三行,這個ABAP類實現了接口if_serializable_object,這意味著它可以被關鍵字CALL TRANSFORMATION進行序列化和反序列化操作。
使用下面的ABAP代碼:
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.
執行之后,在調試器里發現lo_instance和lo_instance2指向了兩個不同的對象實例,說明此時這個ABAP單例模式已經被破壞了。
再看看Java,下面是一個最簡單的Java單例模式:
然而我們仍然可以通過Java的反射機制來破壞這個單例:
Class<?> classType = JerrySingleton.class; Constructor<?> c = classType.getDeclaredConstructor(null); c.setAccessible(true); JerrySingleton e1 = (JerrySingleton)c.newInstance(); JerrySingleton e2 = JerrySingleton.getInstance(); System.out.println(e1 == e2);
在Java里,我們可以通過枚舉類來防御這種反射攻擊:
public enum JerrySingletonAnotherApproach { INSTANCE ; private String name = "Jerry" ; public String getName() { return this.name; } }
這種單例模式的消費代碼:
System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());
此時別有用心的攻擊者如果想使用反射機制創建新的實例,會收到下面的報錯信息:
Exception in thread "main" java.lang.NoSuchMethodException: singleton.JerrySingletonAnotherApproach.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at singleton.SingletonAttack.test3(SingletonAttack.java:31)
at singleton.SingletonAttack.main(SingletonAttack.java:43)
感謝各位的閱讀,以上就是“ABAP和Java里的單例模式攻擊實例”的內容了,經過本文的學習后,相信大家對ABAP和Java里的單例模式攻擊實例這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!
當前文章:ABAP和Java里的單例模式攻擊實例-創新互聯
轉載源于:http://vcdvsql.cn/article16/dsocdg.html
成都網站建設公司_創新互聯,為您提供軟件開發、品牌網站設計、響應式網站、網站收錄、做網站、品牌網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯