Недавно группа по безопасности моего проекта выпустила документ с рекомендациями по безопасному коду, предназначенный для использования в рамках наших обзоров кода. Первое, что меня поразило, это предмет, который сказал «Не использовать внутренние классы». Я подумал, что это похоже на очень тяжелое рутинное заявление. Внутренние классы хороши, если их правильно использовать правильно ?, но я сделал немного поискового запроса и нашел this, приведенный здесь для удобства.Внутренние классы java представляют угрозу безопасности?
Правило 5: Не используйте внутренние классы
Некоторых книги Java языка говорят, что внутренние классы могут быть доступны только внешних классы, которые ограждают их. Это неправда. Байт-код Java имеет нет концепции внутренних классов, поэтому внутренние классы переводятся компилятором в обычные классы, которые происходят с , доступны для любого кода в том же пакете. Правило 4 говорит, что он не должен зависеть от размера упаковки для защиты.
Но подождите, все ухудшается. Внутренний класс получает доступ к полям внешнего окружения , даже если эти поля являются приватными. И внутренний класс переведен в отдельный класс класса . Чтобы позволить этому доступ отдельного класса к полям внешний класс, компилятор молча изменяет эти поля от частного до ! Плохо, что выставлен внутренний класс, но это еще хуже того, что компилятор бесшумно отменяет ваше решение до делает некоторые поля закрытыми. Не используйте внутренние классы, если вы можете помочь. (Как ни странно, новая Java 2 директивы doPrivileged() использование API предполагают, что вы используете внутренний класс написать привилегированный код. Это одна причина, почему мы не нравится doPrivileged() API.)
Мои вопросы
- все еще существует такое поведение в Java 5/6?
- Действительно ли это угроза безопасности, учитывая, что любой класс, кроме внешних и внутренних классов, которые пытались получить доступ к закрытым членам внешнего класса, не собирался?
- Означает ли он достаточный риск для безопасности, чтобы подтвердить «руководство» «Не использовать внутренние классы»?
Подождите секунду? Это означает: «Я не могу использовать самый популярный способ создания обратных вызовов в Swing?» – Artyom
, если это действительно политика безопасности в вашей компании во время обзора кода, незамедлительно сообщите о своей компании на ежедневный веб-сайт –
@Zac Bowling: thedailywtf.com, а другой - просто дверь. – nalply