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?
Antworten:
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.Widget
in der das Paketcom.example
versiegelt ist undWidget
geschützte / Standardmitglieder hat, erstellen Sie eine Klassecom.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
friend
Schlü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 dieString
Die 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.BigDecimal
basiert aufBigInteger
und 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
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.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.
quelle