Система модулей Java Platform - в чем смысл защиты? - PullRequest
1 голос
/ 15 апреля 2019

Я прочитал, что одним из преимуществ JPMS является лучшая инкапсуляция (все ограничено, если явно не открыто).

Но у меня возникает вопрос: что мешает программисту заменить module-info.class в стороннем модуле JARи экспортировать все пакеты или даже сделать модуль open, чтобы все было доступно через отражение (включая private членов).

Является ли JPMS чем-то, что действительно может помочь скрыть внутренний код, или это простокак в Java 8 и более ранних версиях: все доступны через Reflection API, даже private членов (для Java 9 требуется дополнительный шаг для открытия модуля)?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Я думаю, будет справедливо сказать, что защита в смысле безопасности / защищенного от взлома кода является не основной целью JPMS.

Если вмешательство все еще возможно, все еще очень важно иметь возможность обнаружить , независимо от того, играет ли данное приложение по правилам (или, в какой степени правила были смягчены).

Одна очевидная мотивация заключается в том, чтобы более или менее мягко подталкивать разработчиков к созданию "хорошего, модульного" кода. Постепенно «лучший» код все еще «лучше», чем «плохой» код. Потребность в дополнительных мерах в некоторых случаях станет причиной противостоять искушению.

Менее очевидной мотивацией является поддержка расширенного модульного анализа потока во время выполнения , что будет способствовать тому, что оптимизация JIT может безопасно выполнять.

Много лет назад я придумал термин «постепенная инкапсуляция», чтобы обозначить метод и технологию, которые обеспечивают «столько инкапсуляции, сколько вы можете себе позволить», не менее, но важно и не больше, чем вы можете себе позволить (создание идеальной инкапсуляции имеет свою цену ). Набор параметров командной строки JPMS для настройки модульности можно рассматривать как набор инструментов для точного объявления исключений, когда вы не можете позволить себе совершенную инкапсуляцию (по одной из различных возможных причин). Подделка файлов jar, конечно, возможна , но она также обнаруживается , если оригинал подписан. Во всем этом очень важно быть «честным», даже если вы не можете быть «идеальным».

(Все термины в кавычках явно относятся к п.в.).

1 голос
/ 06 июня 2019

Существует принципиальная разница между исправлением сохраненного модуля и использованием Reflection для доступа к закрытым членам без изменения сохраненных классов.

Как правило, нет абсолютной безопасности. Безопасность всегда зависит от того, насколько тяжела работа злоумышленника. В лучшем случае успешная атака требует гораздо больше работы, чем то, что может получить от нее злоумышленник.

Если у вас есть доступ к коду, включая возможность изменить его или создать измененную копию, все ставки в любом случае отключены.

Но основной упор делается не на такую ​​безопасность, а на то, чтобы помочь разработчикам правильно использовать библиотеку. До появления модульной системы любой класс public и его члены public или protected были доступны и даже предлагались IDE, например по завершении кода, автоматически, и потребовалось дополнительное усилие, чтобы сообщить IDE, что некоторые классы или члены не являются частью API и поэтому не должны предлагаться или даже отклоняться при компиляции кода, ссылающегося на них.

В настоящее время с модулем требуется дополнительное усилие, чтобы снова сделать доступными артефакты, не относящиеся к API, что значительно меняет игру. Теперь сделать доступ к артефакту без API снова одинаково сложно, независимо от его модификаторов доступа, так что вы не можете ошибочно думать, что что-то является частью API, просто потому что это public.

Аналогичным образом, вы не можете ожидать, что разработчик библиотеки будет поддерживать обратную совместимость со взломами Reflection в своих внутренних компонентах. Вы не можете полностью предотвратить такой доступ. Но чем больше усилий потребуется разработчику для создания такого кода, тем лучше он будет знать, что он не в курсе и не может ожидать, что результат продолжит работать в следующей версии.

...