中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

單例模式中反射漏洞和反序列化漏洞的示例分析

發布時間:2021-09-03 13:53:50 來源:億速云 閱讀:132 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關單例模式中反射漏洞和反序列化漏洞的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

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

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
	{
		// 正常創建單例對象
		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的構造方法
		cons.setAccessible(true);			// 跳過方法的可見性檢查
		SingletonLazy s3 = cons.newInstance();	// 調用構造方法生成新對象
		SingletonLazy s4 = cons.newInstance();	// 調用構造方法生成新對象
		System.out.println(s3);
		System.out.println(s4);
		
		// 用反序列化破解單例
		FileOutputStream fos = new FileOutputStream("object.out");	// 文件輸出流
		ObjectOutputStream oos = new ObjectOutputStream(fos);		// 對象輸出流
		oos.writeObject(s1);										// 向文件序列化對象
		oos.close();												// 關閉對象輸出流
		fos.close();												// 關閉文件輸出流
		
		FileInputStream fis = new FileInputStream("object.out");	// 文件輸入流
		ObjectInputStream ois = new ObjectInputStream(fis);			// 對象輸入流
		SingletonLazy s5 = (SingletonLazy) ois.readObject();		// 從文件反序列化對象
		ois.close();												// 關閉對象輸入流
		fis.close();												// 關閉文件輸入流
		System.out.println(s5);
	}
}

運行結果

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

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

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

package singleton;

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

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

感謝各位的閱讀!關于“單例模式中反射漏洞和反序列化漏洞的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

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

AI

沅江市| 孙吴县| 阿坝县| 营山县| 保山市| 阳东县| 桐乡市| 巴楚县| 平南县| 固阳县| 许昌县| 繁峙县| 鱼台县| 松阳县| 新丰县| 财经| 克什克腾旗| 女性| 遂川县| 云梦县| 达孜县| 峨眉山市| 朝阳区| 姜堰市| 察哈| 天祝| 舟曲县| 个旧市| 德钦县| 嵊泗县| 定兴县| 新巴尔虎左旗| 水富县| 东丽区| 周宁县| 巍山| 上栗县| 桐乡市| 灌阳县| 石家庄市| 吉首市|