1 - Отражение (как концепция) действительно ортогонально безопасности / безопасности.
При разработке Java был сделан большой упор на то, чтобы сделать его безопасной платформой, с статической типизацией , менеджер безопасности , дисциплинированное использование загрузчика классов , и нет возможности прикрутить указатели / memory .Вы можете прочитать интервью Джеймса Гослинга в Мастер программирования , что интересно об этом.
Но чем больше у отражающей мощности, тем труднее ее обеспечитьвсе безопасно, как и должно.Отражение побеждает, в частности, статическую типизацию и может привести к ошибкам во время выполнения.
Но могут происходить и более тонкие вещи.Например, загрузчики классов - которые можно рассматривать как отражающий хук в системе - не были спроектированы должным образом в ранней версии Java, что привело к потенциальной замене типов.Статья Динамическая загрузка классов в JVM, Гилада Брача, проницательна по таким вопросам.
Отражение нельзя отключить вообще;всегда можно поразмышлять над своими открытыми полями / методами.Однако отражение в частных структурах с AccessibleObject.setAccessible
можно отключить, поскольку оно нарушает encapsulation .При доступе к приватным полям и т. Д. Возможна проверка и изменение внутренних данных.Это может привести к различным вредоносным эксплойтам , например
strings
больше не являются неизменяемыми и могут быть изменены (см. Этот вопрос ) - вы можете раскрыть разумную информацию об объектах, которые вам не принадлежат
- ... другие эксплойты ...
Наконец, есть другой механизм, который ставит под угрозу безопасность, в частности sun.misc.Unsafe
, который дает прямой доступ к памяти - указатели вернулись.
2 - Вопрос в том, приводит ли рефлексия (на практике) к такому множеству рисков.
Я прочитал ссылку, указанную @ dbyrne , но в основном этоо .net.Также я не знаю точно, что отключено для Google App.Это только ReflectPermission
или другое разрешение администратора безопасности?Очевидно, одна опасность - получить доступ к файловой системе и бездельничать.
Проблема доступа к частным данным и нарушения инкапсуляции может быть обсуждена на практике.Написание защищенного кода действительно чрезвычайно сложно, и даже без изменения модификатора доступа вы можете подклассировать классы ненадлежащим образом - если они не являются final
или даже лучше - запечатаны - и передавать их.Это, например, то, от чего защитное копирование пытается защитить.
Типовой безопасности в любом случае также угрожает ошибка времени выполнения из-за сбоя, поэтому с этим также можно поспорить.
В общей / размещенной среде безопасность относительно.На уровне языка вы можете, например, не запретить модульной форме, потребляющей 100% ЦП или потребляющей всю память вплоть до OutOfMemoryException
.Такие проблемы необходимо решать другими способами, обычно на уровне ОС, с виртуализацией и квотами.
Поэтому мой личный ответ будет таким: Отражение - это риск для безопасности, но на практике не такой большой.по сравнению с другими потенциальными векторами атаки.