2010-05-21 14 views
13

Angenommen, ich habe eine Klasse in meinem Paket org.jake und es hat eine Methode mit Standardzugriff (kein Modifikator). Dann ist die Methode nur innerhalb des Pakets sichtbar.Äußere Klassen, die auf package-private Methoden zugreifen

Wenn jedoch jemand das Glas meines Rahmens erhält, was soll sie daran hindern, eine neue Klasse zu schreiben, ihr Paket als org.jake deklarieren und meine vermeintlich unsichtbare Methode verwenden?

Mit anderen Worten, kann ich etwas tun, um dies zu verhindern?

+0

Es kann sich lohnen, Ihren Titel so zu bearbeiten, dass es nicht funktioniert verwende das Wort "geschützt" nicht, da das eine sehr spezifische Bedeutung hat. –

Antwort

16

Sie könnten seal the package in Ihrer JAR-Datei. Es ist jedoch nicht kugelsicher.

Die Hauptsache ist nicht auf Zugriffsmodifizierer etc aus der Sicht der Sicherheit zu starten, wirklich. Wenn jemand den Code mit uneingeschränkten Berechtigungen ausführt, hat er Zugriff auf alle möglichen Dinge. Access-Modifikatoren helfen wirklich nur Menschen aus versehentlich zu stoppen schießen sich in den Fuß.

Wenn jemand bereit ist, Klassen in Ihr Paket zu legen, um Ihre Kapselung zu umgehen, ignorieren sie eindeutig Ihre besten Absichten - ich sage, lassen Sie sie weitermachen, aber bieten keine Unterstützung für dieses Szenario.

6

Sie können nichts dagegen tun. Auch private Mitglieder können durch Reflektion erreicht werden. Sie sollten die Zugriffsmodifizierer in Java als suggestiv betrachten.

0

Ich würde sagen, einfach nicht zulassen, dass sie Code ausführen, wo Sie Ihren, d. H. In der gleichen JVM aufrufen können. Sie könnten stattdessen in Erwägung ziehen, nur einen (Web-) Dienst anzubieten, den sie extern aufrufen können. Ich bin jedoch nicht sehr auf dem Laufenden über die besten Möglichkeiten, dies zu implementieren.

1

Zunächst ist dies das "DRM" -Szenario: schließlich jemand bestimmt genug kann alle Schutzmaßnahmen, die Sie an Ort und Stelle durch die Bereitstellung einer funky modifizierten Laufzeit oder andere solche Dinge zu besiegen. Das umgekehrte Szenario - wo die Laufzeit vertrauenswürdig ist, aber einige der Pakete nicht - wird von Java durch die Verwendung geeigneter ClassLoader-Einschränkungen ordnungsgemäß behoben, aber das kann nur funktionieren, wenn es etwas gibt, das die Beschränkungen vertrauenswürdig durchsetzen kann; Deshalb ist dein Szenario grundsätzlich zum Scheitern verurteilt.

jedoch wenn wir davon ausgehen, dass die Laufzeit selbst vertrauenswürdig ist dann könnte man versuchen, in Ihrer super-geheimen Methode, den Stack-Trace des aktuell ausgeführten Stapels bekommen (siehe stackoverflow.com/questions/1069066/… für wie) und Tests, um zu sehen, ob die Der Aufrufer der aktuellen Methode ist einer, dem Sie vertrauen, um Zugriff zu erhalten. Ein Sicherheitsmanager wäre sogar noch besser geeignet, aber Sie können der Umgebung nicht vertrauen, dass eine solche installiert wird, die Sie mögen (sie ist viel klarer unter der Kontrolle des Angreifers). Beachten Sie, dass ich die Optionen in diesem Absatz nicht ausprobiert habe!

Die andere Alternative besteht darin, Ihre Geheimnisse auf einen von Ihnen kontrollierten Dienst zu legen und nur den Remote-Zugriff auf sie zu ermöglichen. Oder hören Sie auf, sich über technische Mechanismen zu kümmern, um ein Problem zu lösen, das sich hauptsächlich auf geschäftliche und rechtliche Probleme bezieht (z. B. warum haben Sie es mit Leuten zu tun, denen Sie nicht vertrauen können?)

+0

Sie können das 'java.security.Permission'-Framework nicht verwenden, da der Benutzer sich selbst volle Macht geben kann. –

Verwandte Themen