Der private
Modifikator wird verwendet, um den Zugriff außerhalb der Klasse einzuschränken, aber mithilfe der Reflektion können andere Klassen 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.
security
reflection
user245930
quelle
quelle
Antworten:
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 im wahrsten Sinne des Wortes.
quelle
So zitieren Sie Herb Sutter zu Zugriffsrechten für Klassen :
"Hier geht es darum, vor Murphy zu schützen und vor Machiavelli zu schützen ... das heißt, vor versehentlichem Missbrauch zu schützen (was die Sprache sehr gut kann) und vor vorsätzlichem Missbrauch zu schützen (was praktisch unmöglich ist) Ein Programmierer möchte unbedingt das System untergraben, er wird einen Weg finden. "
quelle
#define private public
(ignoriert, dass es sich tatsächlich um Undefiniertes Verhalten handelt) und voila Ich habe von außen vollen Zugriff auf den eingeschränkten Teil Ihrer Klassen.Nein, das ist eigentlich ein wichtiger Vorteil. Nur weil einige Entwickler nicht der Meinung waren, dass jemand Zugriff auf einen Teil des internen Zustands benötigen würde, heißt das nicht, dass kein legitimer Anwendungsfall jemals auftauchen wird. In diesen Fällen kann die Verwendung von Reflection zur Durchführung von Operationen an einem Objekt der letzte Ausweg sein. Ich musste diese Technik mehrmals anwenden.
quelle
Sie schränken die Zugänglichkeit noch weiter ein, indem Sie eine Ebene höher gehen: die Ausführungsumgebung.
Nicht alle Sprachen haben dieses Konzept, aber zumindest mit Java können Sie einen Sicherheitsmanager verwenden, der es verbietet, private Felder zugänglich zu machen. Sie können den Sicherheitsmanager zur Laufzeit manuell installieren oder eine Sicherheitsrichtlinie in eine JAR-Datei einfügen, die dann versiegelt wird, um Änderungen zu verhindern.
Weitere Informationen dazu in Java: Reflection Security
quelle
Über was für ein Spiegelbild sprichst du?
In vielen Reflektionssystemen ist das Umgehen der Kapselung eine explizite Funktion, die Ihr Code erhalten muss und standardmäßig nicht hat.
Wenn Sie sich Gedanken über die Verkapselung machen, besteht die einfache Lösung darin, kein Reflexionssystem zu verwenden, das es nicht bewahrt.
quelle
In Python gibt es keine Zugriffsmodifikatoren. Die Konvention besteht darin, die Methoden und Variablen, auf die nicht von außerhalb der Klasse zugegriffen werden soll, mit einem Präfix zu versehen. Verhindert es technisch, dass Sie von einer Klasse eines Drittanbieters auf ein solches Feld zugreifen können? Überhaupt nicht; Aber wenn Sie dies tun, sind Sie auf sich allein gestellt und riskieren, etwas zu zerbrechen, ohne die andere Klasse beschuldigen zu können.
In C # sind Zugriffsmodifikatoren vorhanden, es handelt sich jedoch nur um eine Konvention, die von einem Compiler erzwungen wird, aber immer noch eine Konvention ist. Das bedeutet, dass man technisch gesehen immer noch auf private Variablen zugreifen und diese ändern kann, entweder durch Reflection oder durch direkte Manipulation des Speichers (wie bei Spieletrainern) tun). Die Konsequenz ist genau die gleiche: Wenn die Variablen Ihrer Klasse durch Reflection einer anderen Klasse oder durch Manipulation des Speichers durch eine andere Anwendung geändert werden und etwas in Ihrer Klasse beschädigt wird, ist dies nicht Ihre Schuld.
Beachten Sie, dass dies offensichtlich zu Sicherheitsproblemen führt, bei denen ein Dritter auf Ihre Daten zugreifen kann. Dies führt zu verschlüsselten Varianten eines Strings und ähnlichen Datenstrukturen. Der Schutz Ihres Codes vor einer solchen Verwendung ist jedoch eher mit Zugriffsbeschränkungen auf Betriebssystem- und Codeebene verbunden und hat an sich nichts mit Reflection zu tun.
quelle