private
Модифікатор використовується для обмеження доступу ззовні класу, але з допомогою відображення інших класів може отримати доступ приватного методу і поля. Тож мені цікаво, як ми можемо обмежити доступність, якщо це є частиною вимоги.
private
Модифікатор використовується для обмеження доступу ззовні класу, але з допомогою відображення інших класів може отримати доступ приватного методу і поля. Тож мені цікаво, як ми можемо обмежити доступність, якщо це є частиною вимоги.
Відповіді:
Мета модифікаторів доступу полягає в тому, щоб повідомити розробникам пишучий код про те, що є загальнодоступним інтерфейсом класу. Вони жодним чином не є заходом безпеки, і вони буквально не приховують і не захищають будь-яку інформацію.
Щоб процитувати Herb Sutter про права доступу до класу :
"Проблема тут полягає в захисті від Мерфі проти захисту від Макіавеллі ... тобто захисту від випадкових зловживань (що мова робить дуже добре) проти захисту від навмисних зловживань (що фактично неможливо). Зрештою, якщо програміст хоче досить погано підривати систему, він знайде спосіб "
#define private public
(ігноруючи, що це насправді не визначена поведінка) і вуаля, я маю повний доступ ззовні до обмеженої частини ваших занять.
Ні, це насправді важлива перевага. Просто тому, що якийсь розробник не вважав, що комусь потрібен буде доступ до якогось внутрішнього стану, не означає, що жоден законний випадок використання ніколи не з’явиться. У цих випадках використання рефлексії для проведення операції на об'єкті може бути крайнім засобом. Мені довелося використовувати цю техніку не раз.
Ви ще більше обмежуєте доступність, піднімаючи ще один рівень: середовище виконання.
Не всі мови мають це поняття, але принаймні з Java ви можете використовувати менеджер безпеки, який забороняє робити приватні поля доступними. Ви можете вручну встановити менеджер безпеки під час виконання або додати політику безпеки у файл jar, який потім запечатаний для запобігання модифікації.
Більше інформації про це на Java: Reflection Security
Про яку рефлексію ви говорите?
У багатьох системах відображення обхід капсуляції є явною можливістю, яку повинен отримати ваш код, і не має за замовчуванням.
Якщо ви стурбовані інкапсуляцією, простим рішенням є просто не використовувати систему відображення, яка не зберігає її.
У Python немає модифікаторів доступу. Конвенція полягає в тому, щоб підкреслити за допомогою підкреслення методи та змінні, до яких не очікується доступ за межами класу. Чи технічно це заважає вам отримати доступ до такого поля від стороннього класу? Зовсім не; але якщо ви це зробите, ви самостійно, і ви ризикуєте щось зламати, не маючи змоги звинуватити інший клас.
У C # модифікатори доступу існують, але вони все ще є лише умовою - такою, яку застосовує компілятор, але все ще конвенцією. Це означає, що в технічному відношенні ви все одно можете отримувати доступ та змінювати приватні змінні або через Reflection, або шляхом прямого втручання в пам'ять (як це роблять тренери з ігор ). Наслідок точно такий же: якщо змінні вашого класу змінюються через Reflection від іншого класу або через підробку пам’яті іншим додатком, і це щось порушує у вашому класі, це не ваша вина.
Зауважте, що це, очевидно, створює проблеми із безпекою, коли сторона може отримати доступ до ваших даних; те, що призводить до зашифрованих варіантів рядка та подібних структур даних. Але захист вашого коду від такого використання є більшою мірою пов’язаною з обмеженнями доступу до ОС та рівня коду і не має нічого спільного з Reflection як такою.