Was sind die Gründe für das Versiegeln eines .jars und wie würde ich das überprüfen?

9

Ich habe ein versiegeltes Glas erstellt, sehe aber keinen Unterschied zur Verwendung eines nicht versiegelten Glases.

  • Welche Tests kann ich durchführen, um zu überprüfen, ob das Glas versiegelt ist?
  • Welchen Grund könnten wir bevorzugen, einen versiegelten gegenüber einem zu verwenden?
  • Wird ein Siegel den Benutzern meiner Projekte Probleme bereiten?
Wassermann-Kraft
quelle
3
Ich habe den Titel und die Hauptfrage im Beitrag umformuliert (meistens kleinere Wortlautänderungen an dieser Stelle). Es sollte jetzt ein bisschen besser sein.
1
Haben Sie Versiegelungspakete in einer JAR-Datei gelesen ? Dies gilt sowohl für einzelne Packungen als auch für ganze Gläser.

Antworten:

10

Sie können testen, ob ein JAR versiegelt ist, indem Sie eine Klasse definieren, die in einem in der JAR-Datei verwendeten Paket vorhanden ist. Wenn das Glas versiegelt ist, sind normalerweise alle Verpackungen versiegelt, andernfalls können Sie sie pro Packung versiegeln. Die von Ihnen erstellte Klasse sollte dann versuchen, auf geschützte oder Standardmitglieder einer Klasse in diesem Paket zuzugreifen.

Wenn das JAR beispielsweise eine Klasse hat, com.example.Widgetin der das Paket com.exampleversiegelt ist und Widgetgeschützte / Standardmitglieder hat, erstellen Sie eine Klasse com.example.Test, die versucht, auf diese Mitglieder zuzugreifen. Dies sollte fehlschlagen.

Der Grund für das Versiegeln ergibt sich aus einer Beschreibung des Testens: Sie möchten, dass Ihr Code in sich geschlossen ist und Benutzer des JAR nur öffentliche Mitglieder verwenden. Pakete müssen nicht für alle von einem Programm verwendeten Jars (und Bin-Ordner in Ihrer IDE) eindeutig sein. Sie können eine Klasse im selben Paket wie in einem JAR definieren und auf geschützte / Standardmitglieder zugreifen, die Probleme verursachen können. Häufig wird die Standardsichtbarkeit als Analogie zum friendSchlüsselwort von C ++ verwendet, indem anderen Klassen im selben Paket die Möglichkeit gegeben wird, Aktionen auszuführen, die nur sicher sind, da dieselben Programmierer an beiden Klassen arbeiten und ihre Interna verstehen. Möglicherweise verzichtet eine Standard-Sichtbarkeitsmethode auf einige Grenzen, indem der Name der Leistung überprüft wird, mit dem Verständnis, dass Client-Code niemals darauf zugreifen wird. Zum Beispiel dieStringDie Klasse in Java verfügt über einige dieser Arten von Methoden, da die Behandlung von Zeichenfolgen blitzschnell sein muss, da eine große Menge Code darauf angewiesen ist. BigDecimalbasiert auf BigIntegerund verwendet den Standardzugriff, um einige Vorgänge zu optimieren, die andere Benutzer der Klasse nicht verwenden sollten.

TL; DR : Klassen im selben Paket können aus Gründen der Leistung oder Einfachheit auf nicht öffentliche Mitglieder zugreifen. Dieser Zugriff überprüft möglicherweise keine Invarianten und Voraussetzungen. Man kann Klassen im selben Paket an mehreren Stellen im Klassenpfad ablegen. Durch das Versiegeln eines Pakets oder JARs kann der Clientcode nicht auf diese Methoden zugreifen, da sonst möglicherweise Probleme auftreten.

Dies verursacht keine Probleme für Benutzer des Glases. Der Klassenlademechanismus, der auf Ressourcen (z. B. Klassendateien) in Gläsern zugreift, unterstützt versiegelte Gläser und Pakete vollständig.

Verwandte Themen: Versiegeln von Paketen in einer JAR-Datei


quelle
Wenn ich also möchte, dass das Widget vollständig erweiterbar ist, darf ich das Glas nicht verschließen, da geschützte Mitglieder nicht zugänglich sind. oder kann ein anderes Glas erstellt werden, das nicht dafür versiegelt ist, oder? Mit anderen Worten, wie die 3D JMonkeyEngine werden sie ihre Gläser meiner Meinung nach nicht versiegeln (und ich muss darauf achten, dass sie beim Verteilen nicht auch versiegelt werden, aber ich werde sehen, dass mein Projekt nicht funktioniert, wenn es versiegelt ist, denke ich, weil ich und erweitere Zugang zu geschützten Mitgliedern).
Wassermann Power
Außerdem wollte ich den Zugriff geschützter Mitglieder von Klassen im selben Projekt verhindern. In diesem Fall müsste ich wohl ein weiteres kleines Projekt erstellen und das versiegelte Glas für das Hauptprojekt verwenden, oder? oder könnte es einen anderen Weg geben?
Wassermann Power
Ich habe auch über eine SecurityException gelesen, falls wir versuchen, eine Klasse eines versiegelten Pakets zu "überschreiben".
Wassermann Power
1
Aus dem verlinkten Artikel: "Pakete in JAR-Dateien können optional versiegelt werden. Dies bedeutet, dass alle in diesem Paket definierten Klassen in derselben JAR-Datei archiviert werden müssen." Hier geht es lediglich darum, die Paketspezifikation einer Klasse einzuschränken , was sich auf Standard- / geschützte Mitglieder auswirkt, auf die andere Klassen im selben Paket zugreifen können, wie ich es in meiner Antwort beschrieben habe. Dies ist orthogonal zur Vererbung, dh Sie können Klassen in versiegelten Gläsern erweitern und auf diese Weise auf geschützte Mitglieder zugreifen.
Wenn Sie möchten, dass eine Klasse in einem versiegelten Paket nicht erweitert wird, machen Sie es final. Wenn Sie möchten, dass es innerhalb des JARs, aber nicht außerhalb erweitert wird, müssen Sie sich mit Standard-Sichtbarkeitsklassen, Schnittstellen, Factory-Methoden usw. befassen, die außerhalb des Geltungsbereichs dieser Frage liegen.
2

Um Ihre zweite Frage zu beantworten, versiegeln wir unsere Jars als Sicherheitsmaßnahme, da dies eine Form der Code-Injektion verhindert, bei der zur Laufzeit zusätzliche Klassen zu unserer Codebasis hinzugefügt werden.

Wir haben eine gewisse Reflexion in unserem Code, bei der Objekte basierend auf Benutzereingaben erstellt werden. Mit dem Code, der diese Objekte erstellt, können nur Klassen aus festen Paketnamen instanziiert werden.

Durch das Versiegeln der Gläser, die die Klassen enthalten, die Benutzer erstellen können sollen, kann der Benutzer auf keinen Fall neue potenziell gefährliche Klassen erstellen und von unserer Software zur Laufzeit instanziieren lassen. Wenn sich die Klasse nicht im richtigen Paket befindet, wird sie von unserem Code nicht geladen. Wenn Sie die Jars versiegeln, können Sie nur auf die Klassen zugreifen, auf die die Benutzer Zugriff haben sollen.

Wenn unsere Gläser nicht versiegelt wären, könnte der Benutzer möglicherweise neue Klassen hinzufügen, die instanziiert werden könnten. Dies wäre ein Sicherheitsrisiko.

TL; DR: Indem Sie Ihre Gläser verschließen, können Sie eine Art von böswilliger Code-Injektion verhindern.

Mark Douglas
quelle
Im Grunde müssten wir also den Zugriff auf die neu instanziierten Klassen fest codieren (Zeichenfolgenkonstante), um zu gewährleisten, dass sie sich auf dem richtigen Paket befinden. Ich frage mich auch, ob dies die Jrat-Profilerstellung beeinträchtigen könnte.
Wassermann Power