2016-08-22 91 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表达式比普通的序列化对象更广泛的安全隐患困扰。