it-swarm.com.de

Ist Reflexion ein Nachteil, da private Variablen nicht eingeschränkt werden können?

Der Modifikator private wird verwendet, um den Zugriff außerhalb der Klasse einzuschränken. Mithilfe der Reflektion können andere Klassen jedoch auf private Methoden und Felder zugreifen. Ich frage mich daher, wie wir die Zugänglichkeit einschränken können, wenn dies Teil der Anforderung ist.

14
user245930

Der Zweck von Zugriffsmodifikatoren besteht darin, Entwickler, die Code schreiben, über die öffentliche Schnittstelle einer Klasse zu informieren. Sie stellen in keiner Weise eine Sicherheitsmaßnahme dar und verbergen oder sichern keine Informationen buchstäblich.

54
JacquesB

Um zu zitieren Herb Sutter über Klassenzugriffsrechte :

"Hier geht es darum, sich vor Murphy zu schützen und sich vor Machiavelli zu schützen ... das heißt, sich vor versehentlichem Missbrauch zu schützen (was die Sprache sehr gut macht) und sich vor absichtlichem Missbrauch zu schützen (was praktisch unmöglich ist) ein Programmierer will dringend genug, um das System zu untergraben, er wird einen Weg finden "

31

Nein, das ist eigentlich ein wichtiger Vorteil. Nur weil einige Entwickler nicht daran gedacht haben, dass jemand Zugriff auf einen internen Status benötigen würde, bedeutet dies nicht, dass niemals ein legitimer Anwendungsfall auftauchen wird. In diesen Fällen kann die Verwendung von Reflection zur Durchführung einer Operation an einem Objekt das letzte Mittel sein. Ich musste diese Technik mehr als einmal anwenden.

10
Mason Wheeler

Sie schränken die Zugänglichkeit noch weiter ein, indem Sie eine weitere Ebene aufsteigen: die Ausführungsumgebung.

Nicht alle Sprachen haben dieses Konzept, aber zumindest mit Java können Sie einen Sicherheitsmanager verwenden, der den Zugriff auf private Felder verbietet. Sie können den Sicherheitsmanager zur Laufzeit manuell installieren oder eine Sicherheitsrichtlinie hinzufügen Eine JAR-Datei, die dann versiegelt wird, um Änderungen zu verhindern.

Weitere Informationen dazu in Java: Reflection Security

4
user22815

Über welche Reflexion sprichst du?

In vielen Reflexionssystemen ist das Umgehen der Kapselung eine explizite Funktion, die Ihr Code erhalten muss und die standardmäßig nicht vorhanden ist.

Wenn Sie sich Gedanken über die Kapselung machen, besteht die einfache Lösung darin, kein Reflexionssystem zu verwenden, das diese nicht beibehält.

3
Jörg W Mittag

In Python gibt es keine Zugriffsmodifikatoren. Die Konvention besteht darin, den Methoden und Variablen, auf die von außerhalb der Klasse nicht zugegriffen werden soll, einen Unterstrich voranzustellen. Verhindert es technisch, dass Sie von einer Drittanbieter-Klasse auf ein solches Feld zugreifen? Ganz und gar nicht; Aber wenn Sie dies tun, sind Sie allein und gehen das Risiko ein, etwas zu zerbrechen, ohne die andere Klasse beschuldigen zu können.

In C # gibt es Zugriffsmodifikatoren, die jedoch nur eine Konvention sind - eine, die von einem Compiler erzwungen wird, aber immer noch eine Konvention ist. Dies bedeutet, dass man technisch immer noch auf private Variablen zugreifen und diese ändern kann, entweder durch Reflection oder durch direkte Manipulation des Speichers (wie Spieltrainer do). Die Konsequenz ist genau die gleiche: Wenn die Variablen Ihrer Klasse durch Reflection von einer anderen Klasse oder durch Speichermanipulation durch eine andere Anwendung geändert werden und etwas in Ihrer Klasse kaputt geht, ist dies nicht Ihre Schuld.

Beachten Sie, dass dies offensichtlich zu Sicherheitsproblemen führt, bei denen ein Dritter auf Ihre Daten zugreifen kann. etwas, das zu verschlüsselte Varianten eines Strings und ähnlichen Datenstrukturen führt. Der Schutz Ihres Codes vor einer solchen Verwendung hängt jedoch eher mit dem Betriebssystem und Zugriffsbeschränkungen auf Codeebene zusammen und hat nichts mit Reflection an sich zu tun.

3