簡體   English   中英

二進制序列化本質上是不安全的嗎?

[英]Is binary serialization inherently unsafe?

微軟警告不要使用BinaryFormatter (他們寫道,沒有辦法使反序列化安全)。

應用程序應該盡快停止使用 BinaryFormatter,即使他們認為他們正在處理的數據是值得信賴的。

我不想使用基於XMLJson的解決方案(這是他們所指的)。 我擔心文件大小並保留 object 圖。

如果我要編寫自己的方法來遍歷我的 object 圖形並將對象轉換為二進制文件可以安全地制作,還是特別是從二進制文件轉換使其本質上更危險的文本?

是否有BinaryFormatter的二進制(非 XML 和非 JSON)替代品?

感覺這個問題會導致更多基於意見的答案。

我敢肯定那里有很多庫,但也許最著名的替代方案是協議緩沖區(protobuf)。 這是一個谷歌圖書館,所以它得到了大量的發展和關注。 然而,並不是所有人都同意使用 protobuf 進行通用二進制序列化是最好的做法。

如果您想了解更多信息,請關注 dotnet 的 github 上有關 BinaryFormatter 的討論 它討論了BinaryFormatter的一般問題,以及使用 protobuf 作為替代方案。

我可以創建自己的安全二進制序列化系統嗎?

是的。 也就是說,真正的問題應該是:“值得我花時間這樣做嗎?”

有關BinaryFormatter的結束計划,請參閱此鏈接: https://github.com/dotnet/designs/pull/141/commits/bd0a0661f9d248ed31a354d27ad026efd6719690

在最底部,您會發現:

為什么不讓BinaryFormatter對不受信任的有效負載安全?

BinaryFormatter協議通過指定對象的原始實例字段的值來工作。 換句話說, BinaryFormatter的全部意義在於繞過對象的典型構造函數並使用私有反射將實例字段設置為通過網絡傳入的內容。 以這種方式繞過構造函數意味着 object 無法執行任何驗證或以其他方式保證其內部不變量得到滿足。 這樣做的一個后果是BinaryFormatter是不安全的,即使對於看似無害的類型,例如ExceptionList<T>Dictionary<TKey, TValue> ,無論TTKeyTValue的實際類型如何。 將反序列化限制為允許的類型列表不會解決此問題。

安全問題不在於二進制序列化作為概念; 問題在於如何實現BinaryFormatter

如果你願意,你可以設計一個安全的二進制反序列化系統。 如果您發送的消息很少,並且您可以嚴格控制要反序列化的類型,那么制作安全系統可能不會花費太多精力。

然而,對於一個足夠靈活以處理許多不同用例的系統(例如可以反序列化的許多不同類型),您可能會發現構建足夠的安全檢查需要付出很多努力。


FWIW,您可能永遠無法使用提供相同廣泛實用程序(用例)的安全系統達到BinaryFormatter的性能水平,因為BinaryFormatter的速度(部分)來自於很少的安全功能 可能會使用具有有限用例集的有針對性的小型系統來接近這樣的性能水平。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM