Отключить reflection Java для текущего streamа

Мне нужно назвать некоторый полунадежный Java-код и вы хотите отключить возможность использования отражения в течение всего выполнения этого кода.

try{ // disable reflection somehow someObject.method(); } finally{ // enable reflection again } 

Это можно сделать с помощью SecurityManager, и если да, то как?

Разъяснение / Контекст. Это продолжение другого вопроса об ограничении пакетов, которые можно вызывать из JavaScript / Rhino. Принятый ответ ссылается на запись в блоге о том, как это сделать, и для этого требуется два шага, первый из которых использует Rhino API (ClassShutter), второй – отключение отражения и Class.forName (). Я думал, что могу сделать этот второй шаг более чисто, используя SecurityManager (узнав о SecurityManager, который, как было указано, является сложным зверьком, на этом пути).

Подводя итог, я хочу (из кода, а не устанавливать файл) отключить Class.forName () и любой доступ ко всему пакету отражения.

    Это зависит от того, что вы пытаетесь ограничить.

    В общем, общеansible API не ограничен. Однако, пока вы не предоставите ненадежный код ReflectPermission("suppressAccessChecks") , он не сможет получить доступ к нерусскому API в другом пакете.

    Если у вас есть список пакетов, к которым вы хотите ограничить доступ, есть два шага. Во-первых, в свойствах Security включите ограниченный пакет в список package.access . Затем введите свой надежный код RuntimePermission("accessClassInPackage." + pkg) .

    Обычный способ отличить ваш ненадежный код – загрузить его из другого места и ссылаться на различные кодовые базы в файле политики при предоставлении разрешений.

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


    Сделать то, что вы хотите, не изменяя файл java.policy и / или файл java.security , будет очень сложно, возможно, невозможно. java.security.Policy представляет информацию в java.policy , но не предоставляет доступ к записи. Вы можете создать свою собственную реализацию Policy и установить ее во время выполнения, если это разрешит любой существующий SecurityManager .

    С другой стороны, вы можете указать пользовательский файл java.policy в качестве параметра командной строки. Если вы предоставляете полное приложение с помощью своего рода пусковой установки, это может быть легко выполнено. Он также обеспечивает определенную прозрачность для ваших пользователей. Изощренный пользователь может просмотреть разрешения, которые вы хотели бы предоставить приложению.

    Ну, вы можете переопределить SecurityManager.checkMemberAccess и дать более строгие определения. Однако на самом деле это не так. Что происходит, например, если код определяет финализатор?

    Пояснение: Другие API используют рефлексию и другие API. Например, java.beans, LiveConnect и Rhino. Противник может из сценария, скажем, создать новый контекст Rhino без затвора и, таким образом, загрузиться в полную JRE. С открытой системой черный список никогда не может быть завершен.

    В итоге: для использования модели безопасности Java вам необходимо работать с ней, а не против нее.

    Я написал замену ClassShutter, которая позволяет осуществлять мелкозернистый контроль доступа на каждый экземпляр для каждого метода для каждого поля:

    http://riven8192.blogspot.com/2010/07/java-rhino-fine-grained-classshutter.html

    Interesting Posts

    URL-адрес кликов в окне сообщений Winform?

    Пользовательский менеджер проверки подлинности с функцией Spring Security и Java Configuration

    Лучший способ удалить из NSMutableArray во время итерации?

    Решение между искусственным первичным ключом и естественным ключом для таблицы Products

    Сгенерировать полный SQL-скрипт из EF 5 Первые шаги миграции кода

    Почему Windows 7 x64 не может использовать всю установленную память?

    List, IList, IEnumerable, IQueryable, ICollection, который является наиболее гибким типом возврата?

    Что означает ## для препроцессора C (C ++)?

    Неблокирующий вход консоли C ++

    Могу ли я программно очищать уведомления моего приложения от Центра уведомлений iOS 5?

    Почему Java-streamи отключены?

    Есть ли какой-либо инструмент командной строки, который можно использовать для редактирования переменных среды в Windows?

    Просмотр содержимого файла базы данных в Android Studio

    Ресурс API для облачных сообщений Firebase

    Как я могу войти в систему с несколькими социальными службами с Firebase?

    Давайте будем гением компьютера.