2016-08-22 6 views
7

Просто переходя Streams и Java 8 лямбда-функциональность, а последний комментарий иначе само за себя Oracle документ Lambda Expressions состояния:Каковы риски безопасности при сериализации выражения лямбда?

Вы можете сериализовать лямбда-выражение, если его целевого типа и его захваченные аргументы сериализуемы , Однако, как и внутренние классы, сериализация лямбда-выражений настоятельно не рекомендуется.

Проверка на это я нашел SO вопроса

How to serialize a lambda?

где OP имеет дело с сериализованными лямбдой-выражениями из клиентского кода.

Если у меня был веб-сервис, и один из параметров был лямбда-выражением, похоже, он мог содержать вредоносный код, который мог бы делать такие вещи, как доступ к файловой системе, или вызвать переполнение стека - поэтому было бы очень глупо доверять Это.

Я перехитрил риск безопасности или существуют ограничения на то, что может содержать сериализованное выражение?

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/25443655/possibility-to-explicit-remove-serialization-support-for-a-lambda) для примера. Как уже указывалось в вашем цитировании, внутренние классы могут открыть аналогичную проблему. Я не совсем уверен, как вы передаете лямбда-выражение в контексте веб-службы. – Holger

+1

Просто, чтобы сделать ясно, сериализация выражения лямбда не сериализует код внутри выражения; только такие вещи, как захваченные аргументы. –

ответ

4

Давайте рассмотрим этот путь: сериализация объектов Java (в определенной степени) - кошмар безопасности в любом случае (см., Например, here).

Другими словами: Сериализация сама по себе является темой, где нужно быть действительно вдумчивым в первую очередь. Так что это не имеет большого значения, если вы говорите о сериализованных лямбдах или любых других сериализованных объектах.

Так, например, вы хотите убедиться, что вы понимаете и поддерживаете соответствующие правила, например, от CERT.

3

Одна из рекомендаций в Oracle Secure Coding Руководства по Java SE является

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

По существу, один и та же проверка достоверности, которые будут применяться к аргументам конструктор также должна быть применена к входящему десериализованные данные. Это можно сделать для обычных объектов, предоставляя метод readObject, который выполняет проверку. Тем не менее, NOT можно предоставить метод readObject для сериализованных lambdas, поэтому невозможно выполнить валидацию сериализованных данных для лямбда.

Сериализованные лямбды разделяют все риски безопасности с сериализацией обычных объектов, но в этом отношении сериализованные лямбды страдают от более широких рисков безопасности, чем обычные сериализуемые объекты.

Смежные вопросы