Какой смысл иметь личные свойства, если вы можете изменить их с помощью отражения? - PullRequest
4 голосов
/ 18 ноября 2009

Я знаю, это звучит глупо, но насколько безопасен ваш API, если вы можете получить доступ к частным свойствам и изменить их?

Ответы [ 7 ]

10 голосов
/ 18 ноября 2009

Какой смысл иметь замки на вашей двери, когда люди могут просто пнуть дверь? Использование отражения требует больше навыков и больше усилий. По большей части код в порядке. В любом случае, Reflection плохо работает в условиях неполного доверия.

6 голосов
/ 18 ноября 2009

На языке, не поддерживающем рефлексию, всегда есть возможность обойти API через прямой доступ к памяти.

Инкапсуляция - это не защита вашего API от неправильного использования, а скрытие частей кода, которые могут быть изменены. Если код клиента использует официальный интерфейс - он продолжит работать после такого изменения. Если нет, то это был автор этого кода, который просто выстрелил ему в ногу.

4 голосов
/ 18 ноября 2009

Ну, по крайней мере, в .NET вы можете запретить отражение , используя разрешения .NET.

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

В любом случае, я нахожу этот вопрос вроде как: "Какова цель дверей, имеющих замки, если я могу разбить их достаточно большим молотком?" : -)

1 голос
/ 18 ноября 2009

Вы можете запретить доступ к частным свойствам, установив SecurityManager . Поэтому, если вам это нужно, вы можете сделать его приватным (и заплатить цену: некоторые сторонние библиотеки больше не будут работать).

Как и законы, private - это ценник. Они говорят: «Если вы не будете следовать правилам, которые я навязываю, вам придется заплатить». Это не значит, что вы должны следовать правилам (точно так же, как убийство людей вне закона не останавливало убийство).

1 голос
/ 18 ноября 2009

Использование личных свойств с отражением такое же, как и без него, но если кто-то подумает об использовании отражения для доступа к закрытым членам в стороннем классе, он должен быть совершенно уверен, что знает, что он делает, - и он точно знает, что это может нарушить работоспособность.

1 голос
/ 18 ноября 2009

Несмотря на то, что рефлексия очень полезна, она считается косвенным методом изменения свойств, а не методом, который должен поддерживаться или поддерживаться вашим API.

Сказав, что, устанавливая частное свойство, гарантирует, что оно не будет изменено теми, кто обращается к нему с помощью , что обычно означает

1 голос
/ 18 ноября 2009

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

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