2016-08-22 78 views
7

正要過流和Java 8 LAMBDA功能,以及對否則不言自明的Oracle文檔Lambda Expressions美國最後一個註釋:lambda表達式序列化中的安全風險是什麼?

你可以,如果它的目標類型序列lambda表達式及其 拍攝參數是序列化。但是,像內部類一樣,強烈建議不要使用lambda表達式的 序列化。

檢查了這條我發現如此質疑

How to serialize a lambda?

,其中OP是處理來自客戶端的代碼序列化的lambda表達式。

如果我有一個webservice,其中一個參數是一個lambda表達式,它似乎可能包含惡意代碼,可能會執行諸如文件系統訪問,或導致堆棧溢出等 - 因此,信任是非常愚蠢的它。

難道我overexaggerating的安全風險,還是有限制到什麼序列化的表達式可以包含哪些內容?

+1

查看[this question](http://stackoverflow.com/questions/25443655/possibility-to-explicit-remove-serialization-support-for-a-lambda)爲例。正如您在引用中指出的那樣,內部班級可能會引發類似的問題。我不太確定,但是如何在Web服務的上下文中傳遞lambda表達式。 – Holger

+1

爲了清楚起見,序列化lambda表達式不會序列化表達式中的代碼;只有像捕獲的參數。 –

回答

4

讓我們這樣說吧:Java對象序列化是(在一定程度上)一個安全噩夢反正(見here爲例)。

換句話說:系列化本身就是一個需要真正體貼的主題。因此,如果您談論序列化的lambda表達式或任何其他類型的序列化對象,則無關緊要。

所以,比如你要確保你理解和支持CERT相應的規則,等等。

3

一個在Oracle的建議安全編碼指南爲Java SE是

Guideline 8-3/SERIAL-3: View deserialization the same as object construction

從本質上講,這將適用於構造函數的參數相同的驗證檢查,也應適用於傳入反序列化的數據。通過提供執行驗證的readObject方法,可以爲普通對​​象執行此操作。然而,這是NOT能夠用於序列化的lambda提供一種readObject方法,因此不能夠進行串行化數據的任何驗證對拉姆達。

序列化的lambda分享所有與普通對象的序列化的安全隱患,但在這方面的系列化從lambda表達式比普通的序列化對象更廣泛的安全隱患困擾。

相關問題