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