深入剖析deserialization

在軟件開發過程中,序列化和反序列化常常用於將對象轉換為可在網絡上傳輸或存儲的格式。其中序列化是將對象轉換為二進制數據,反序列化是將其還原為對象。這裡我們將關注deserialization反序列化。

一、deserialization error

反序列化過程中可能會出現錯誤。例如發生對象轉換錯誤或序列化格式錯誤(如嘗試反序列化xml格式的數據),都會導致反序列化失敗。這時我們便需要跟蹤反序列化過程以尋找錯誤原因。一種查找方法是在程序中插入日誌語句,另一種方法是藉助現成的工具,如Wireshark和Fiddler等。

二、deserialization vulnerability

反序列化也可能存在安全漏洞。黑客很容易利用反序列化漏洞,從而實現遠程代碼執行和數據泄露這些攻擊動作。一種常見的漏洞是應用程序接受並反序列化用戶提交的數據,並將其傳遞到不受信任的代碼中,這就可能導致遠程代碼執行攻擊。另外,插入惡意對象也可能導致數據泄露漏洞。為了減少反序列化漏洞,建議在傳輸和存儲敏感數據時要進行加密,並在反序列化過程中使用反序列化過濾器來限制類的反序列化。

import java.io.*;
import java.util.Base64;

public class SerializedObject {
  public byte[] toByteArray() {
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(this);
      return baos.toByteArray();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  public static SerializedObject fromBase64String(String base64) {
    try {
      ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64)));
      return (SerializedObject) ois.readObject();
    } catch (ClassNotFoundException | IOException e) {
      throw new RuntimeException(e);
    }
  }
}

三、deserialization failed

如果反序列化失敗,可能是因為缺少必需的類或包。這時我們需要檢查是否已經正確配置類路徑,或者手動添加需要的類和包。

import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Jack";
      e.address = "Haidian, Beijing";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

四、deserialization error翻譯

如果程序在反序列化過程中發生了錯誤,可以根據錯誤信息進行排查。在Java中,反序列化時可能會出現ClassNotFoundException,InvalidClassException,StreamCorruptedException等異常。我們可以捕獲異常並輸出對應的錯誤信息,以幫助我們找出問題所在。

五、deserialization error鵝鴨殺

針對反序列化過程中可能存在的安全漏洞,在Java中提供了一種叫鵝鴨殺的機制。當Java反序列化調用readObject()方法時,會首先判斷待反序列化的類是否實現了Serializable接口。如果不是,則會拋出一個鵝鴨聲音異常org.apache.commons.collections.functors.InvokerTransformer(反序列化機制中僅使用)。

import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Deproxy {
        public static void main(String[] args) throws Exception {
                ObjectInputStream in = new ObjectInputStream(new FileInputStream(args[0]));
                in.readObject();
        }
}

六、serialization

與反序列化相關的還有序列化,序列化是將Java對象轉化成字節流的過程,可以用於實現遠程對象的傳輸和存儲。以下示例中,我們定義了一個類並實現了序列化接口,將對象序列化並寫入文件,然後再通過反序列化將其讀取出來。

import java.io.*;

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

import java.io.*;

public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

結論

綜上所述,反序列化是一項重要的功能,但也存在着安全風險和錯誤風險。在開發中,我們需要加強對反序列化的認知並在程序設計中進行嚴格的防範措施以保障應用的安全性和穩定性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150473.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-08 14:54
下一篇 2024-11-08 14:54

相關推薦

  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱“存儲程序控制原理”,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25

發表回復

登錄後才能評論