C#在 .NET 9.0 中啟用二進制序列化:配置、風險與替代方案

在 .NET 9.0 中啟用二進制序列化:配置、風險與替代方案

  • 引言
    • 一、啟用二進制序列化的步驟
    • 二、實現序列化與反序列化
    • 三、安全風險與緩解措施
    • 四、推薦替代方案
    • 五、總結

引言

在 .NET 生態中,二進制序列化(Binary Serialization)曾是實現對象持久化和跨進程通信的常用技術。然而,自 .NET 5 起,BinaryFormatter 因安全漏洞被標記為過時,并在默認配置下禁用。對于仍需在 .NET 9.0 中使用此功能的開發者,本文將詳細解析啟用步驟、潛在風險及推薦替代方案。

一、啟用二進制序列化的步驟

修改項目配置

.csproj 文件中添加以下配置,解除 BinaryFormatter 的限制:

<PropertyGroup><EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>

注意:
此配置會觸發編譯警告 SYSLIB0011,需開發者顯式接受安全風險。

僅建議在完全可控的環境中使用(如內部工具或遺留系統遷移)。
標記可序列化類型

為需要序列化的類添加 [Serializable] 特性:

[Serializable]
public class Person {
public string Name { get; set; }
[NonSerialized] 
public int SecretCode; // 此字段不會被序列化

二、實現序列化與反序列化

序列化對象

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;public byte[] Serialize(object obj) 
{using (var stream = new MemoryStream()) {var formatter = new BinaryFormatter();formatter.Serialize(stream, obj);return stream.ToArray();}
}

反序列化對象

public T Deserialize<T>(byte[] data) 
{using (var stream = new MemoryStream(data)) {var formatter = new BinaryFormatter();return (T)formatter.Deserialize(stream);}
}

關鍵問題:
反序列化時需確保目標類型 T 與原始類型完全匹配(包括程序集版本),否則會拋出 SerializationException

三、安全風險與緩解措施

已知風險

反序列化漏洞:攻擊者可構造惡意數據觸發代碼執行(如 ISerializable 接口濫用)。

類型注入:反序列化不受信任數據可能導致意外類型加載。
緩解建議

數據來源可信:僅反序列化來自可信源(如內部系統生成)的數據。

輸入驗證:對反序列化前的字節流進行簽名或校驗。

沙箱隔離:在獨立 AppDomain 中執行反序列化操作。

四、推薦替代方案

System.Text.Json

特點:高性能、低內存分配,支持異步序列化。

場景:REST API、跨平臺數據交換。

var json = JsonSerializer.Serialize(obj);
var obj = JsonSerializer.Deserialize<T>(json);

Protobuf-net

特點:緊湊二進制格式,高效且類型安全。

場景:高性能通信(如 gRPC)、大數據持久化。

using ProtoBuf;
[ProtoContract]
public class Person {[ProtoMember(1)]public string Name { get; set; }

XML 序列化

特點:可讀性強,支持 XML 架構驗證。

場景:配置文件、與舊系統兼容。

var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stream, obj);

五、總結

盡管 .NET 9.0 仍支持通過配置啟用 BinaryFormatter,但其高安全風險和版本兼容性問題使其不再適用于現代應用。建議優先選擇 System.Text.JsonProtobuf-net 等替代方案。若必須使用二進制序列化,請嚴格遵循以下原則:
僅處理可信數據源。

隔離反序列化操作環境。

監控并更新依賴庫以修復潛在漏洞。

技術演進提示:微軟已明確表示未來版本可能徹底移除 BinaryFormatter,建議盡早制定遷移計劃。

// 歷史終將淘汰舊技術,但我們可以優雅地過渡。
pragma warning disable SYSLIB0011var legacyData = oldFormatter.Deserialize(stream); 
pragma warning restore SYSLIB0011

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81968.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何解決鴻蒙應用閃退問題

如何解決鴻蒙應用閃退問題 本文是一份面向 ArkTS&#xff0f;JavaScript&#xff0f;C 多語言開發者的綜合性排查與優化手冊&#xff0c;覆蓋 HarmonyOS/OpenHarmony 5.x 時代 常見閃退根因、診斷流程、調試技巧、CI 監控及線上防護方案&#xff0c;力爭幫你把 Crash 數量降到 …

【Java高階面經:微服務篇】4.大促生存法則:微服務降級實戰與高可用架構設計

一、降級決策的核心邏輯:資源博弈下的生存選擇 1.1 大促場景的資源極限挑戰 在電商大促等極端流量場景下,系統面臨的資源瓶頸呈現指數級增長: 流量特征: 峰值QPS可達日常的50倍以上(如某電商大促下單QPS從1萬突增至50萬)流量毛刺持續時間短(通常2-4小時),但對系統穩…

關于我對傳統系統機構向大模型架構演進的認知

最近這段時間在研究大模型&#xff0c;不可避免會接觸到架構。從我職業經歷一路走來&#xff0c;自然會拿著現有模型的架構和我之前接觸到的系統架構進行對比。今天就大模型的架構和傳統系統架構進行一下梳理&#xff0c;說一說我的見解。 在我眼里&#xff0c;傳統系統架構如…

圖片識別(TransFormerCNNMLP)

目錄 一、Transformer &#xff08;一&#xff09;ViT&#xff1a;Transformer 引入計算機視覺的里程碑 &#xff08;二&#xff09;Swin-Transformer&#xff1a;借鑒卷積改進 ViT &#xff08;三&#xff09;VAN&#xff1a;使用卷積模仿 ViT &#xff08;四&#xff09;…

性能測試、壓力測試、負載測試如何區分

一、前言&#xff1a;為何區分三者如此重要&#xff1f; “你們做過壓力測試嗎&#xff1f;”“系統性能測試做得怎么樣&#xff1f;”“負載測試的數據能分享一下嗎&#xff1f;” 在很多軟件開發與測試團隊的日常溝通中&#xff0c;“性能測試”“壓力測試”“負載測試”這…

工業路由器WiFi6+5G的作用與使用指南,和普通路由器對比

工業路由器的技術優勢 在現代工業環境中&#xff0c;網絡連接的可靠性與效率直接影響生產效率和數據處理能力。WiFi 6&#xff08;即802.11ax&#xff09;和5G技術的結合&#xff0c;為工業路由器注入了強大的性能&#xff0c;使其成為智能制造、物聯網和邊緣計算的理想選擇。…

紫光同創FPGA實現AD9238數據采集轉UDP網絡傳輸,分享PDS工程源碼和技術支持和QT上位機

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目紫光同創FPGA相關方案推薦我這里已有的以太網方案本方案在Xilinx系列FPGA的應用方案 3、設計思路框架工程設計原理框圖AD輸入源AD9238數據采集AD9238數據緩存控制模塊…

如何修改服務器管理員賬號名和密碼(1)

命令解析sudo useradd -m -s /bin/bash 新用戶名 1. sudo 作用&#xff1a;以超級用戶(root)權限執行命令 為什么需要&#xff1a;創建用戶需要修改系統文件(/etc/passwd, /etc/shadow等)&#xff0c;普通用戶沒有這個權限 替代方案&#xff1a;如果已經是root用戶&#xff0…

Linux shell 正則表達式高效使用

Linux正則表達式高效使用教程 正則表達式是Linux命令行中強大的文本處理工具&#xff0c;能夠極大提高搜索和匹配效率。下面為新手提供一個簡單教程&#xff0c;介紹如何在grep和find命令中使用正則表達式。 使用建議&#xff1a;使用grep時要加-E選項使其支持擴展正則表達式&…

你通俗易懂的理解——線程、多線程與線程池

一&#xff1a;異常處理 1.1 異常概述 &#xff08;1&#xff09;場景 &#xff08;2&#xff09;定義 &#xff08;3&#xff09;異常拋出機制 Java把不同的異常用不同的類表示 &#xff08;4&#xff09;如何對待異常 1.2 常見異常類 &#xff08;1&#xff09;Throwable &am…

w~自動駕駛~合集13

我自己的原文哦~ https://blog.51cto.com/whaosoft/13933252 # 小米智能駕駛技術的一些猜測 來蹭一下小米汽車智能駕駛的熱度&#xff0c;昨晚聽了雷總小米汽車的發布&#xff0c;心潮澎湃尋思下單一輛奈何現實不允許hhh。 言歸正傳吧&#xff0c; 本來是想主要聽一下小米…

AI 面試幫 開發日志

項目源碼 https://cnb.cool/szu/TravelBest/Platform/-/tree/main 文章目錄 架構微服務網絡通信延遲 中間件redisMongoDB 架構 微服務 優點&#xff1a; 模塊間解耦、職責清晰&#xff0c;獨立部署與擴展&#xff0c;單個服務故障不會影響整個系統&#xff0c;便于持續交付與…

論文閱讀(四):Agglomerative Transformer for Human-Object Interaction Detection

論文來源&#xff1a;ICCV&#xff08;2023&#xff09; 項目地址&#xff1a;https://github.com/six6607/AGER.git 1.研究背景 人機交互&#xff08;HOI&#xff09;檢測需要同時定位人與物體對并識別其交互關系&#xff0c;核心挑戰在于區分相似交互的細微視覺差異&#…

部署java項目

1.編寫shell腳本部署服務 restart.sh #!/bin/bash # # start the user program # echo "-------------------- start jk service --------------------" LOG_DIR"/home/joy/usr/app/ers-log" LOG_FILE"$LOG_DIR/log_$(date "%Y%m%d").txt&…

第18天-NumPy + Pandas + Matplotlib多維度直方圖

示例1:帶樣式的柱狀圖 python 復制 下載 import numpy as np import pandas as pd import matplotlib.pyplot as plt# 生成數據 df = pd.DataFrame(np.random.randint(10, 100, size=(8, 4)),columns=[Spring, Summer, Autumn, Winter],index=[2015, 2016, 2017, 2018, 20…

關于 Web 安全實踐:4. 文件上傳功能的風險分析與防護

定義&#xff1a;文件上傳風險點是指應用程序允許用戶上傳文件&#xff0c;但沒有嚴格校驗上傳文件的類型、內容、路徑等屬性&#xff0c;導致攻擊者可以上傳并執行惡意代碼。 繞過方式&#xff1a; 前端繞過 1. 前端限制的原理 前端限制上傳文件類型的常見方式有三種&#…

升級SpringBoot2到3導致的WebServices升級

背景 WebServices 是基于開放標準&#xff08;XML、SOAP、HTTP 等&#xff09;的 Web 應用程序&#xff0c;它們與其他 Web 應 用程序交互以交換數據。WebServices 可以將您現有的應用程序轉換為 Web 應用程序。 老代碼中有一個19年前的包&#xff0c;由于漏洞原因&#xff0c;…

Vue3中插槽, pinia的安裝和使用(超詳細教程)

1. 插槽 插槽是指, 將一個組件的代碼片段, 引入到另一個組件。 1.1 匿名插槽 通過簡單的案例來學習匿名插槽&#xff0c;案例說明&#xff0c;在父組件App.vue中導入了子組件Son1.vue&#xff0c;父組件引用子組件的位置添加了一個片段&#xff0c;比如h2標簽&#xff0c;然…

【Redis】AOF日志

目錄 1、背景2、工作原理3、核心配置參數4、優缺點5、AOF文件內容 1、背景 AOF&#xff08;Append Only File&#xff09;是redis提供的持久化機制之一&#xff0c;它通過記錄所有修改數據庫狀態的寫命令來實現數據庫持久化。與RDB&#xff08;快照&#xff09;方式不同&#…

【HTTP】connectionRequestTimeout與connectTimeout的本質區別

今天發現有的伙伴調用第三方 httpclient 的配置中 connectTimeout 和 connectionRequestTimeout 配置的不到 1 S&#xff0c;問了一下他&#xff0c;知不知道這兩個參數的意思&#xff0c;他說不知道。那我們今天就來了解一下這兩個參數的區別 一、核心概念解析 1.1 connectT…