最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

單例模式的反射漏洞和反序列化漏洞代碼實例

 更新時間:2019年04月09日 09:09:17   作者:da_kao_la  
這篇文章主要介紹了單例模式的反射漏洞和反序列化漏洞,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

除了枚舉式單例模式外,其余4種在單例模式提到的單例模式的實現(xiàn)方式都存在反射漏洞和反序列化漏洞。

package singleton;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;

/**
 * 用反射和反序列化的方法破解單例模式
 * @author weiyx15
 *
 */
public class SingletonCrack {
	public static void main(String[] args) throws Exception
	{
		// 正常創(chuàng)建單例對象
		SingletonLazy s1 = SingletonLazy.getInstance();
		SingletonLazy s2 = SingletonLazy.getInstance();
		System.out.println(s1);
		System.out.println(s2);
		
		// 用反射破解單例
		Class<SingletonLazy> cls = (Class<SingletonLazy>) Class.forName("singleton.SingletonLazy");		// 獲取SingletonLazy類
		Constructor<SingletonLazy> cons = cls.getDeclaredConstructor(null);		// 獲取SingletonLazy的構(gòu)造方法
		cons.setAccessible(true);			// 跳過方法的可見性檢查
		SingletonLazy s3 = cons.newInstance();	// 調(diào)用構(gòu)造方法生成新對象
		SingletonLazy s4 = cons.newInstance();	// 調(diào)用構(gòu)造方法生成新對象
		System.out.println(s3);
		System.out.println(s4);
		
		// 用反序列化破解單例
		FileOutputStream fos = new FileOutputStream("object.out");	// 文件輸出流
		ObjectOutputStream oos = new ObjectOutputStream(fos);		// 對象輸出流
		oos.writeObject(s1);										// 向文件序列化對象
		oos.close();												// 關(guān)閉對象輸出流
		fos.close();												// 關(guān)閉文件輸出流
		
		FileInputStream fis = new FileInputStream("object.out");	// 文件輸入流
		ObjectInputStream ois = new ObjectInputStream(fis);			// 對象輸入流
		SingletonLazy s5 = (SingletonLazy) ois.readObject();		// 從文件反序列化對象
		ois.close();												// 關(guān)閉對象輸入流
		fis.close();												// 關(guān)閉文件輸入流
		System.out.println(s5);
	}
}

運行結(jié)果

singleton.SingletonLazy@15db9742 // s1
singleton.SingletonLazy@15db9742// s2
singleton.SingletonLazy@6d06d69c// s3
singleton.SingletonLazy@7852e922// s4
singleton.SingletonLazy@3b07d329 // s5

 從運行結(jié)果可以看到,通過反射可以得到私有構(gòu)造方法,從而實例化兩個不同的對象實例 codesingleton.SingletonLazy@6d06d69c}和{@code singleton.SingletonLazy@7852e922}. 通過反序列化,也可以得到新對象{@code singleton.SingletonLazy@3b07d329}.

以懶漢式單例模式的實現(xiàn)為例,解決反射漏洞和反序列化漏洞的方法如下:

package singleton;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 排除了反射漏洞和反序列化漏洞的懶漢式單例模式
 * @author weiyx15
 *
 */
public class SingletonLazySafe implements Serializable{
	private static SingletonLazySafe instance;
	
	private SingletonLazySafe() {
		// 防止反射漏洞通過再次調(diào)用私有構(gòu)造方法實例化新的instance
		if (instance != null)
		{
			throw new RuntimeException();	// 拋出運行時異常
		}
	}
	
	public static synchronized SingletonLazySafe getInstance() {
		if (instance == null)	// 如果未實例化,則先實例化
		{
			instance = new SingletonLazySafe();	// 調(diào)用getInstance方法后再實例化對象
		}
		return instance;
	}
	
	/**
	 * 從I/O流讀取對象時會調(diào)用readResolve接口
	 * 在readResolve接口中直接返回instance對象
	 * 避免反序列化時重新實例化對象
	 * @return 單例對象
	 * @throws ObjectStreamException
	 */
	private Object readResolve() throws ObjectStreamException {
		return instance;
	}
}

以上所述是小編給大家介紹的單例模式的反射漏洞和反序列化漏洞詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java基于注解的Excel導出方式

    Java基于注解的Excel導出方式

    這篇文章主要介紹了Java基于注解的Excel導出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用棧的迷宮算法java版代碼

    使用棧的迷宮算法java版代碼

    這篇文章主要為大家詳細介紹了使用棧的迷宮算法java版代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別

    Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別

    Java中NoClassDefFoundError和ClassNotFoundException的區(qū)別,從類繼承層次上來看,ClassNotFoundException是從Exception繼承的,所以ClassNotFoundException是一個檢查異常。具體詳情需要的朋友可以參考下面文章內(nèi)容
    2022-06-06
  • 詳解shiro緩存機制

    詳解shiro緩存機制

    Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實現(xiàn)Cache,但是對Cache進行了又抽象,方便更換不同的底層Cache實現(xiàn)。下面通過實例代碼給大家分享shiro緩存機制,感興趣的朋友一起看看吧
    2017-09-09
  • SpringDataJpa like查詢無效的解決

    SpringDataJpa like查詢無效的解決

    這篇文章主要介紹了SpringDataJpa like查詢無效的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • spring NamedContextFactory實現(xiàn)服務隔離的示例詳解

    spring NamedContextFactory實現(xiàn)服務隔離的示例詳解

    假設(shè)我們有個場景,我們需要實現(xiàn)服務之間的數(shù)據(jù)隔離、配置隔離、依賴的spring bean之間隔離,大家會有什么實現(xiàn)思路?今天給大家介紹spring-cloud-context里面有個NamedContextFactory可以達到上面的效果,需要的朋友可以參考下
    2024-05-05
  • SpringCloud Finchley Gateway 緩存請求Body和Form表單的實現(xiàn)

    SpringCloud Finchley Gateway 緩存請求Body和Form表單的實現(xiàn)

    在接入Spring-Cloud-Gateway時,可能有需求進行緩存Json-Body數(shù)據(jù)或者Form-Urlencoded數(shù)據(jù)的情況。這篇文章主要介紹了SpringCloud Finchley Gateway 緩存請求Body和Form表單的實現(xiàn),感興趣的小伙伴們可以參考一下
    2019-01-01
  • springboot如何添加task任務執(zhí)行隊列

    springboot如何添加task任務執(zhí)行隊列

    這篇文章主要介紹了springboot如何添加task任務執(zhí)行隊列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MyBatis的 config.xml標簽

    MyBatis的 config.xml標簽

    這篇文章主要介紹了MyBatis的 config.xml標簽的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Spring Boot修改啟動端口的方法

    Spring Boot修改啟動端口的方法

    下面小編就為大家?guī)硪黄猄pring Boot修改啟動端口的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

安岳县| 分宜县| 丰城市| 鄂伦春自治旗| 罗田县| 东兰县| 都兰县| 闸北区| 祥云县| 页游| 吐鲁番市| 张家口市| 汾阳市| 江都市| 高青县| 东辽县| 三江| 阿拉善盟| 河东区| 丹棱县| 普兰店市| 西和县| 谷城县| 长海县| 区。| 苍南县| 微博| 定陶县| 通州市| 武乡县| 揭西县| 资讯 | 满洲里市| 波密县| 通山县| 黄骅市| 安阳县| 边坝县| 牙克石市| 常宁市| 六盘水市|