Безопасно ли отражение? - PullRequest
4 голосов
/ 11 июля 2010

Я экспериментирую с PropertyChangeSupport, который имеет полезный метод firePropertyChange.Если безопасность является проблемой, действительно ли безопасно использовать отражение для запуска методов, как показано в строке ниже, или было бы предпочтительнее просто жестко кодировать вызовы имен методов?Если рефлексия является потенциальной проблемой, как можно ее предотвратить?

method.invoke(instance, newValue);

Ответы [ 3 ]

5 голосов
/ 11 июля 2010

Если безопасность является проблемой, действительно ли безопасно использовать отражение для запуска методов [...] или было бы предпочтительнее просто жестко закодировать вызовы имен методов?

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

Безопасность отражения также является потенциальной проблемой.

  • Если ваша JVM работает ненадежно или неизвестнокод, который может пытаться делать плохие вещи, тогда API-интерфейсы отражения в целом предлагают много возможностей делать плохие вещи.Например, он позволяет плохому коду вызывать методы и обращаться к полям, которые не позволят компилятору Java.(Он даже позволяет коду совершать злые вещи, такие как изменение значения атрибутов final и других вещей, которые обычно считаются неизменяемыми.)

  • Даже если ваша JVM работает полностьюДоверяемый код, все еще возможно, что недостаток проекта или проблема безопасности на уровне системы могут позволить хакеру внедрить имена классов или методов.Затем API-интерфейсы отражения будут покорно пытаться вызвать неожиданные методы.

Если отражение является потенциальной проблемой, как можно предотвратить его?

Чтоэто просто.Приложению требуются различные разрешения для успешного вызова соответствующих чувствительных к безопасности методов в API отражений.Эти разрешения по умолчанию предоставляются доверенным приложениям, а не изолированным приложениям.Вы можете настраивать их.

Простое решение: если вы используете доверенный код или если вас беспокоит возможность ошибок проектирования, связанных с безопасностью, запустите весь соответствующий код в изолированной программной среде безопасности, которая предотвращает использованиеAPI отражения.(Недостатком является то, что некоторые сторонние библиотеки спроектированы исходя из предположения, что они могут использовать отражение ... и будут ломаться в песочнице.)

(По-видимому, нет проверки прав доступа для фактического Method.invoke(...) вызов. Проверка происходит раньше, когда код приложения получает объект Method из Class.)

1 голос
/ 11 июля 2010

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

0 голосов
/ 11 июля 2010

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

В целях безопасности вы можете отключить проверки доступа для отраженных объектов , чтобы вы могли вызывать закрытые и защищенные методы других классов, если это не предотвращено SecurityManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...