Προγραμματισμός

Ασφάλεια και αρχιτεκτονική φορτωτή κατηγορίας

Προηγούμενη 1 2 Σελίδα 2 Σελίδα 2 από 2

Φορτωτές τάξης και χώροι ονομάτων

Για κάθε κατηγορία που φορτώνει, η JVM παρακολουθεί ποιος φορτωτής κλάσης - είτε αρχικός είτε αντικείμενο - φόρτωσε την κλάση. Όταν μια φορτωμένη κλάση αναφέρεται πρώτα σε άλλη κλάση, η εικονική μηχανή ζητά την κλάση αναφοράς από τον ίδιο φορτωτή κλάσης που αρχικά φόρτωσε την κλάση αναφοράς. Για παράδειγμα, εάν η εικονική μηχανή φορτώνει κλάση Ηφαίστειο μέσω ενός συγκεκριμένου φορτωτή κλάσης, θα προσπαθήσει να φορτώσει οποιεσδήποτε κλάσεις Ηφαίστειο αναφέρεται μέσω του ίδιου φορτωτή κλάσης. Αν Ηφαίστειο αναφέρεται σε μια τάξη που ονομάζεται Λάβα, ίσως κάνοντας χρήση μιας μεθόδου στην τάξη Λάβα, θα ζητήσει η εικονική μηχανή Λάβα από τον φορτωτή κλάσης που φορτώθηκε Ηφαίστειο. ο Λάβα κλάση που επιστρέφεται από τον φορτωτή κλάσης συνδέεται δυναμικά με την κλάση Ηφαίστειο.

Επειδή η JVM ακολουθεί αυτήν την προσέγγιση για φόρτωση κλάσεων, οι κλάσεις μπορούν από προεπιλογή να βλέπουν μόνο άλλες κλάσεις που φορτώθηκαν από τον ίδιο φορτωτή κλάσης. Με αυτόν τον τρόπο, η αρχιτεκτονική της Java σάς επιτρέπει να δημιουργήσετε πολλαπλάσια ονόματα-κενά μέσα σε μία εφαρμογή Java. Το όνομα-χώρος είναι ένα σύνολο μοναδικών ονομάτων των τάξεων που φορτώνονται από ένα συγκεκριμένο φορτωτή κλάσης. Για κάθε φορτωτή κλάσης, το JVM διατηρεί ένα χώρο-όνομα, το οποίο συμπληρώνεται από τα ονόματα όλων των κλάσεων που έχουν φορτωθεί μέσω αυτού του φορτωτή κλάσης.

Μόλις ένα JVM φορτώσει μια κλάση με το όνομα Ηφαίστειο σε ένα συγκεκριμένο χώρο ονομάτων, για παράδειγμα, είναι αδύνατο να φορτωθεί μια διαφορετική κλάση που ονομάζεται Ηφαίστειο στον ίδιο χώρο-όνομα. Μπορείτε να φορτώσετε πολλαπλάσια Ηφαίστειο τάξεις σε ένα JVM, ωστόσο, επειδή μπορείτε να δημιουργήσετε πολλαπλούς χώρους ονομάτων μέσα σε μια εφαρμογή Java. Μπορείτε να το κάνετε απλά δημιουργώντας πολλαπλούς φορτωτές τάξης. Εάν δημιουργήσετε τρεις ξεχωριστούς χώρους ονομάτων (ένας για καθέναν από τους τρεις φορτωτές κλάσης) σε μια εφαρμογή Java που εκτελείται, τότε, φορτώνοντας έναν Ηφαίστειο τάξη σε κάθε χώρο ονομάτων, το πρόγραμμά σας θα μπορούσε να φορτώσει τρία διαφορετικά Ηφαίστειο μαθήματα στην αίτησή σας.

Μια εφαρμογή Java μπορεί να δημιουργήσει πολλά αντικείμενα φορτωτή κλάσης είτε από την ίδια κλάση είτε από πολλές κλάσεις. Μπορεί, επομένως, να δημιουργήσει τόσα (και τόσα διαφορετικά είδη) αντικείμενα φορτωτή κλάσης όσο χρειάζεται. Τα μαθήματα που φορτώνονται από διαφορετικούς φορτωτές κατηγορίας βρίσκονται σε διαφορετικούς χώρους ονομάτων και δεν μπορούν να αποκτήσουν πρόσβαση ο ένας στον άλλο, εκτός εάν το επιτρέπει ρητά η εφαρμογή. Όταν γράφετε μια εφαρμογή Java, μπορείτε να διαχωρίσετε τάξεις που φορτώνονται από διαφορετικές πηγές σε διαφορετικά κενά ονόματα. Με αυτόν τον τρόπο, μπορείτε να χρησιμοποιήσετε την αρχιτεκτονική φόρτωσης κλάσης Java για να ελέγξετε οποιαδήποτε αλληλεπίδραση μεταξύ κώδικα που φορτώνεται από διαφορετικές πηγές. Μπορείτε να αποτρέψετε τον εχθρικό κώδικα να αποκτήσει πρόσβαση και να ανατρέψει φιλικό κώδικα.

Φορτωτές κατηγορίας για μικροεφαρμογές

Ένα παράδειγμα δυναμικής επέκτασης με φορτωτές κλάσης είναι το πρόγραμμα περιήγησης Web, το οποίο χρησιμοποιεί αντικείμενα φορτωτή κλάσης για να κατεβάσει τα αρχεία τάξης για μια μικροεφαρμογή σε ένα δίκτυο. Ένα πρόγραμμα περιήγησης στο Web ενεργοποιεί μια εφαρμογή Java που εγκαθιστά ένα αντικείμενο φορτωτή κλάσης - συνήθως ονομάζεται φορτωτής κλάσης applet - ξέρει πώς να ζητά αρχεία κλάσης από διακομιστή HTTP. Οι μικροεφαρμογές είναι ένα παράδειγμα δυναμικής επέκτασης, επειδή όταν ξεκινά η εφαρμογή Java, δεν γνωρίζει ποια αρχεία κλάσης θα ζητήσει από το πρόγραμμα περιήγησης να πραγματοποιήσει λήψη σε ολόκληρο το δίκτυο. Τα αρχεία κλάσης για λήψη καθορίζονται κατά το χρόνο εκτέλεσης, καθώς το πρόγραμμα περιήγησης συναντά σελίδες που περιέχουν μικροεφαρμογές Java.

Η εφαρμογή Java που ξεκίνησε από το πρόγραμμα περιήγησης Web δημιουργεί συνήθως ένα διαφορετικό αντικείμενο φορτωτή κλάσης applet για κάθε θέση στο δίκτυο από την οποία ανακτά αρχεία κλάσης. Ως αποτέλεσμα, τα αρχεία τάξης από διαφορετικές πηγές φορτώνονται από διαφορετικά αντικείμενα φορτωτή κλάσης. Αυτό τα τοποθετεί σε διαφορετικούς χώρους ονομάτων εντός της εφαρμογής Java κεντρικού υπολογιστή. Επειδή τα αρχεία τάξης για μικροεφαρμογές από διαφορετικές πηγές τοποθετούνται σε ξεχωριστούς χώρους ονομάτων, ο κώδικας μιας κακόβουλης μικροεφαρμογής δεν επιτρέπεται να παρεμβαίνει απευθείας σε αρχεία κλάσης που έχουν ληφθεί από οποιαδήποτε άλλη πηγή.

Συνεργασία μεταξύ φορτωτών κατηγορίας

Συχνά, ένα αντικείμενο φορτωτή κλάσης βασίζεται σε άλλους φορτωτές τάξης - τουλάχιστον, στον αρχικό αρχικό φορτωτή κλάσης - για να το βοηθήσει να εκπληρώσει ορισμένα από τα αιτήματα φόρτωσης κλάσης που έρχονται στο δρόμο του. Για παράδειγμα, φανταστείτε ότι γράφετε μια εφαρμογή Java που εγκαθιστά έναν φορτωτή κλάσης του οποίου ο συγκεκριμένος τρόπος φόρτωσης αρχείων τάξης επιτυγχάνεται με τη λήψη τους σε ένα δίκτυο. Ας υποθέσουμε ότι κατά τη διάρκεια της εκτέλεσης της εφαρμογής Java, υποβάλλεται ένα αίτημα από τον φορτωτή κλάσης σας για τη φόρτωση μιας κλάσης με το όνομα Ηφαίστειο.

Ένας τρόπος με τον οποίο θα μπορούσατε να γράψετε το πρόγραμμα φόρτωσης τάξης είναι να το ζητήσετε πρώτα από τον αρχέγονο φορτωτή κλάσης να βρει και να φορτώσει την τάξη από το αξιόπιστο αποθετήριο του. Σε αυτήν την περίπτωση, από τότε Ηφαίστειο δεν είναι μέρος του Java API, ας υποθέσουμε ότι ο αρχέγονος φορτωτής κλάσης δεν μπορεί να βρει μια κλάση με το όνομα Ηφαίστειο. Όταν ο αρχικός αρχικός φορτωτής κατηγορίας αποκρίνεται ότι δεν μπορεί να φορτώσει την τάξη, ο φορτωτής τάξης θα μπορούσε τότε να προσπαθήσει να φορτώσει το Ηφαίστειο τάξη με τον προσαρμοσμένο τρόπο, κατεβάζοντάς το σε ολόκληρο το δίκτυο. Υποθέτοντας ότι ο φορτωτής της τάξης σας μπόρεσε να κατεβάσει την τάξη Ηφαίστειο, ότι Ηφαίστειο Η τάξη θα μπορούσε τότε να παίξει ρόλο στη μελλοντική πορεία εκτέλεσης της εφαρμογής.

Για να συνεχίσετε με το ίδιο παράδειγμα, ας υποθέσουμε ότι κάποια στιγμή αργότερα μια μέθοδος τάξης Ηφαίστειο καλείται για πρώτη φορά και ότι η μέθοδος αναφέρεται στην κλάση Σειρά από το Java API. Επειδή είναι η πρώτη φορά που η αναφορά χρησιμοποιείται από το τρέχον πρόγραμμα, η εικονική μηχανή ρωτά τον φορτωτή κλάσης σας (αυτόν που φορτώθηκε Ηφαίστειο) φορτώνω Σειρά. Όπως και προηγουμένως, ο φορτωτής τάξης μεταβιβάζει πρώτα το αίτημα στον αρχικό αρχικό φορτωτή τάξης, αλλά σε αυτήν την περίπτωση, ο αρχικός φορτωτής τάξης μπορεί να επιστρέψει ένα Σειρά class πίσω στο class loader σας.

Ο αρχέγονος φορτωτής τάξης πιθανότατα δεν έπρεπε να φορτώσει πραγματικά Σειρά σε αυτό το σημείο γιατί, δεδομένου ότι Σειρά είναι μια τόσο θεμελιώδης τάξη σε προγράμματα Java, σχεδόν σίγουρα χρησιμοποιήθηκε πριν και ως εκ τούτου έχει ήδη φορτωθεί. Πιθανότατα, ο αρχέγονος φορτωτής τάξης μόλις επέστρεψε το Σειρά κλάση που είχε φορτώσει προηγουμένως από το αξιόπιστο αποθετήριο.

Δεδομένου ότι ο αρχέγονος φορτωτής τάξης μπόρεσε να βρει την τάξη, ο φορτωτής τάξης δεν επιχειρεί να το κατεβάσει σε ολόκληρο το δίκτυο. περνά απλώς στην εικονική μηχανή Σειρά τάξη επέστρεψε από τον αρχέγονο φορτωτή τάξης. Από εκείνο το σημείο και μετά, η εικονική μηχανή το χρησιμοποιεί Σειρά τάξη όποτε τάξη Ηφαίστειο αναφέρει μια κλάση που ονομάζεται Σειρά.

Φορτωτές τάξης στο sandbox

Στο sandbox της Java, η αρχιτεκτονική του φορτωτή κλάσης είναι η πρώτη γραμμή άμυνας κατά κακόβουλου κώδικα. Σε τελική ανάλυση, ο φορτωτής κλάσης φέρνει κώδικα στον κώδικα JVM που μπορεί να είναι εχθρικός.

Η αρχιτεκτονική του φορτωτή κλάσης συμβάλλει στο sandbox της Java με δύο τρόπους:

  1. Αποτρέπει τον κακόβουλο κώδικα να παρεμβαίνει στον καλό κώδικα.
  2. Διατηρεί τα σύνορα των αξιόπιστων βιβλιοθηκών τάξης.

Η αρχιτεκτονική του φορτωτή τάξης προστατεύει τα όρια των αξιόπιστων βιβλιοθηκών τάξης, διασφαλίζοντας ότι οι μη αξιόπιστες τάξεις δεν μπορούν να προσποιούνται ότι είναι αξιόπιστες. Εάν μια κακόβουλη τάξη θα μπορούσε να ξεγελάσει με επιτυχία το JVM να πιστεύει ότι ήταν μια αξιόπιστη τάξη από το Java API, αυτή η κακόβουλη τάξη θα μπορούσε ενδεχομένως να διαπεράσει το φράγμα του sandbox Αποτρέποντας τις μη αξιόπιστες τάξεις από την πλαστοπροσωπία αξιόπιστων κλάσεων, η αρχιτεκτονική του φορτωτή κλάσης αποκλείει μια πιθανή προσέγγιση για να διακυβεύεται η ασφάλεια του χρόνου εκτέλεσης της Java.

Χώροι ονομάτων και ασπίδες

Η αρχιτεκτονική του φορτωτή κλάσης αποτρέπει τον κακόβουλο κώδικα να παρεμβαίνει στον καλοπροαίρετο κώδικα παρέχοντας προστατευμένους χώρους ονομάτων για τάξεις που φορτώνονται από διαφορετικούς φορτωτές κλάσης. Οπως αναφέρθηκε προηγουμένως, όνομα-χώρος είναι ένα σύνολο μοναδικών ονομάτων για φορτωμένες κλάσεις που διατηρείται από την JVM.

Οι χώροι ονομάτων συμβάλλουν στην ασφάλεια επειδή μπορείτε, στην πραγματικότητα, να τοποθετήσετε μια ασπίδα μεταξύ των τάξεων που φορτώνονται σε διαφορετικούς χώρους ονομάτων. Μέσα στο JVM, οι τάξεις στον ίδιο χώρο-όνομα μπορούν να αλληλεπιδρούν μεταξύ τους απευθείας. Τα μαθήματα σε διαφορετικούς χώρους ονομάτων, ωστόσο, δεν μπορούν να ανιχνεύσουν την παρουσία του άλλου, εκτός εάν παρέχετε ρητά έναν μηχανισμό που επιτρέπει στις τάξεις να αλληλεπιδρούν. Εάν μια κακόβουλη τάξη, αφού φορτωθεί, είχε εγγυημένη πρόσβαση σε κάθε άλλη τάξη που φορτώνεται αυτήν τη στιγμή από την εικονική μηχανή, αυτή η τάξη θα μπορούσε ενδεχομένως να μάθει πράγματα που δεν πρέπει να γνωρίζει ή θα μπορούσε να επηρεάσει την ορθή εκτέλεση του προγράμματος σας.

Δημιουργία ασφαλούς περιβάλλοντος

Όταν γράφετε μια εφαρμογή που χρησιμοποιεί φορτωτές κλάσης, δημιουργείτε ένα περιβάλλον στο οποίο εκτελείται ο δυναμικά φορτωμένος κώδικας. Εάν θέλετε το περιβάλλον να μην περιέχει τρύπες ασφαλείας, πρέπει να ακολουθείτε ορισμένους κανόνες όταν γράφετε την εφαρμογή σας και τους φορτωτές τάξης. Σε γενικές γραμμές, θα θελήσετε να γράψετε την αίτησή σας, έτσι ώστε ο κακόβουλος κώδικας να προστατεύεται από καλό κώδικα. Επίσης, θα θελήσετε να γράψετε φορτωτές τάξης έτσι ώστε να προστατεύουν τα σύνορα των αξιόπιστων βιβλιοθηκών τάξεων, όπως αυτά του Java API.

Χώροι ονομάτων και πηγές κώδικα

Για να λάβετε τα οφέλη ασφαλείας που προσφέρονται από τα ονόματα χώρων, πρέπει να βεβαιωθείτε ότι φορτώνετε τάξεις από διαφορετικές πηγές μέσω διαφορετικών φορτωτών τάξης. Αυτό είναι το σχήμα, που περιγράφεται παραπάνω, που χρησιμοποιείται από προγράμματα περιήγησης Web με δυνατότητα Java. Η εφαρμογή Java που απενεργοποιείται από ένα πρόγραμμα περιήγησης στο Web δημιουργεί συνήθως ένα διαφορετικό αντικείμενο φορτωτή κλάσης μικροεφαρμογών για κάθε πηγή κλάσεων που κατεβάζει στο δίκτυο. Για παράδειγμα, ένα πρόγραμμα περιήγησης θα χρησιμοποιούσε ένα αντικείμενο φορτωτή κλάσης για να κατεβάσει μαθήματα από το //www.niceapplets.com και ένα άλλο αντικείμενο φορτωτή κλάσης για να κατεβάσει μαθήματα από το //www.meanapplets.com.

Φύλαξη περιορισμένων πακέτων

Η Java επιτρέπει σε τάξεις του ίδιου πακέτου να παραχωρούν μεταξύ τους ειδικά προνόμια πρόσβασης που δεν παρέχονται σε τάξεις εκτός του πακέτου. Επομένως, εάν ο φορτωτής της τάξης σας λάβει ένα αίτημα για φόρτωση μιας κλάσης που με το όνομά της δηλώνει αγενής ότι είναι μέρος του Java API (για παράδειγμα, μια κλάση που ονομάζεται java.lang.Virus), ο φορτωτής της τάξης σας πρέπει να προχωρήσει προσεκτικά. Εάν φορτωθεί, μια τέτοια τάξη θα μπορούσε να αποκτήσει ειδική πρόσβαση στις αξιόπιστες κατηγορίες του java.lang και θα μπορούσε ενδεχομένως να χρησιμοποιήσει αυτήν την ειδική πρόσβαση για παραπλανητικούς σκοπούς.

Κατά συνέπεια, κανονικά θα γράφατε έναν φορτωτή κλάσης, ώστε απλώς αρνείται να φορτώσει οποιαδήποτε κλάση που ισχυρίζεται ότι είναι μέρος του Java API (ή οποιασδήποτε άλλης αξιόπιστης βιβλιοθήκης χρόνου εκτέλεσης), αλλά αυτό δεν υπάρχει στο τοπικό αξιόπιστο αποθετήριο. Με άλλα λόγια, αφού ο φορτωτής τάξης σας μεταβιβάσει ένα αίτημα στον αρχέγονο φορτωτή τάξης και ο αρχικός αρχιμάγειρας φορτώνει την ένδειξη ότι δεν μπορεί να φορτώσει την τάξη, ο φορτωτής τάξης θα πρέπει να ελέγξει για να βεβαιωθεί ότι η τάξη δεν δηλώνεται ότι είναι μέλος ενός αξιόπιστου πακέτου. Εάν συμβαίνει αυτό, το πρόγραμμα φόρτωσης της τάξης σας, αντί να προσπαθεί να κατεβάσει την τάξη σε ολόκληρο το δίκτυο, θα πρέπει να εξαιρέσει μια ασφάλεια.

Φύλαξη απαγορευμένων πακέτων

Επιπλέον, ενδέχεται να έχετε εγκαταστήσει ορισμένα πακέτα στο αξιόπιστο αποθετήριο που περιέχουν τάξεις που θέλετε να μπορεί να φορτώνει η εφαρμογή σας μέσω του αρχικού αρχικού φορτωτή τάξης, αλλά δεν θέλετε να έχετε πρόσβαση σε τάξεις που φορτώνονται μέσω του φορτωτή κλάσης. Για παράδειγμα, ας υποθέσουμε ότι έχετε δημιουργήσει ένα πακέτο με το όνομα απόλυτη εξουσία και το εγκατέστησα στο τοπικό αποθετήριο προσβάσιμο από τον αρχέγονο φορτωτή τάξης. Ας υποθέσουμε επίσης ότι δεν θέλετε οι τάξεις που φορτώνονται από τον φορτωτή τάξης σας να μπορούν να φορτώσουν οποιαδήποτε κλάση από το απόλυτη εξουσία πακέτο. Σε αυτήν την περίπτωση, θα γράφατε το πρόγραμμα φόρτωσης της τάξης σας έτσι ώστε το πρώτο πράγμα που κάνει είναι να βεβαιωθείτε ότι η κλάση που ζητείται δεν δηλώνεται ως μέλος του απόλυτη εξουσία πακέτο. Εάν ζητηθεί μια τέτοια τάξη, ο φορτωτής τάξης σας, αντί να μεταβιβάσει το όνομα της τάξης στον αρχικό αρχικό φορτωτή κλάσης, θα πρέπει να ρίξει μια εξαίρεση ασφαλείας.

Ο μόνος τρόπος με τον οποίο ένας φορτωτής κλάσης μπορεί να γνωρίζει εάν μια κλάση προέρχεται από ένα περιορισμένο πακέτο, όπως java.langή ένα απαγορευμένο πακέτο, όπως απόλυτη εξουσία, είναι με το όνομα της τάξης. Έτσι, σε έναν φορτωτή κλάσης πρέπει να δοθεί μια λίστα με τα ονόματα των περιορισμένων και απαγορευμένων πακέτων. Επειδή το όνομα της τάξης java.lang.Virus δηλώνει ότι είναι από το java.lang πακέτο, και java.lang βρίσκεται στη λίστα των περιορισμένων πακέτων, ο φορτωτής τάξης σας θα πρέπει να ρίξει μια εξαίρεση ασφαλείας, εάν ο αρχικός αρχικός φορτωτής δεν μπορεί να το φορτώσει. Ομοίως, επειδή το όνομα της τάξης absolutepower.FancyClassLoader δηλώνει ότι είναι μέρος του απόλυτη εξουσία πακέτο, και το απόλυτη εξουσία το πακέτο είναι στη λίστα των απαγορευμένων πακέτων, ο φορτωτής τάξης σας πρέπει να ρίξει μια εξαίρεση ασφαλείας.

Ένας φορτωτής κατηγορίας με ασφάλεια

Ένας συνηθισμένος τρόπος για να γράψετε έναν φορτωτή κλάσης με γνώμονα την ασφάλεια είναι να ακολουθήσετε τα ακόλουθα τέσσερα βήματα:

  1. Εάν υπάρχουν πακέτα από τα οποία δεν επιτρέπεται η φόρτωση αυτού του φορτωτή κλάσης, ο φορτωτής κλάσης ελέγχει εάν η κλάση που ζητείται βρίσκεται σε ένα από αυτά τα απαγορευμένα πακέτα που αναφέρονται παραπάνω. Εάν ναι, ρίχνει μια εξαίρεση ασφαλείας. Εάν όχι, συνεχίζει στο δεύτερο βήμα.

  2. Ο φορτωτής κλάσης μεταβιβάζει το αίτημα στον αρχέγονο φορτωτή κλάσης. Εάν ο αρχικός αρχικός φορτωτής επιστρέφει με επιτυχία την κλάση, ο φορτωτής κλάσης επιστρέφει την ίδια τάξη. Διαφορετικά συνεχίζει στο τρίτο βήμα.

  3. Εάν υπάρχουν αξιόπιστα πακέτα στα οποία δεν επιτρέπεται η προσθήκη κλάσεων σε αυτόν τον φορτωτή κλάσης, ο φορτωτής κλάσης ελέγχει εάν η κλάση που ζητείται βρίσκεται σε ένα από αυτά τα περιορισμένα πακέτα. Εάν ναι, ρίχνει μια εξαίρεση ασφαλείας. Εάν όχι, συνεχίζει στο τέταρτο βήμα.

  4. Τέλος, ο φορτωτής κλάσης προσπαθεί να φορτώσει την τάξη με τον προσαρμοσμένο τρόπο, όπως με τη λήψη του σε ένα δίκτυο. Εάν είναι επιτυχής, επιστρέφει την τάξη. Εάν δεν είναι επιτυχές, ρίχνει ένα σφάλμα "δεν βρέθηκε ορισμός κλάσης".

Εκτελώντας τα βήματα ένα και τρία όπως περιγράφεται παραπάνω, ο φορτωτής κλάσης φυλάσσει τα όρια των αξιόπιστων πακέτων. Με το πρώτο βήμα, αποτρέπει τη φόρτωση μιας κλάσης από ένα απαγορευμένο πακέτο. Με το τρίτο βήμα, δεν επιτρέπει σε μια αξιόπιστη τάξη να εισαχθεί σε ένα αξιόπιστο πακέτο.

συμπέρασμα

Η αρχιτεκτονική του φορτωτή κλάσης συμβάλλει στο μοντέλο ασφαλείας της JVM με δύο τρόπους:

  1. διαχωρίζοντας τον κώδικα σε πολλαπλούς χώρους ονομάτων και τοποθετώντας μια "ασπίδα" μεταξύ του κώδικα σε διαφορετικά διαστήματα ονομάτων
  2. φυλάσσοντας τα σύνορα των αξιόπιστων βιβλιοθηκών τάξης, όπως το Java API

Και οι δύο αυτές δυνατότητες της αρχιτεκτονικής φορτωτή κλάσης Java πρέπει να χρησιμοποιούνται σωστά από τους προγραμματιστές, προκειμένου να αποκομίσουν το όφελος ασφαλείας που προσφέρουν. Για να επωφεληθείτε από την ασπίδα ονόματος-χώρου, ο κώδικας από διαφορετικές πηγές πρέπει να φορτωθεί μέσω διαφορετικών αντικειμένων φορτωτή κλάσης. Για να επωφεληθούν από την αξιόπιστη προστασία περιγράμματος πακέτων, πρέπει να γραφτούν οι φορτωτές τάξεων, ώστε να ελέγχουν τα ονόματα των απαιτούμενων τάξεων σε μια λίστα περιορισμένων και απαγορευμένων πακέτων.

Για μια βόλτα στη διαδικασία σύνταξης ενός φορτωτή τάξης, συμπεριλαμβανομένου του δείγματος κώδικα, δείτε το Chuck McManis's JavaWorld άρθρο, "Τα βασικά των φορτωτών κλάσης Java."

Τον επόμενο μήνα

Στο άρθρο του επόμενου μήνα, θα συνεχίσω τη συζήτηση για το μοντέλο ασφαλείας του JVM, περιγράφοντας τον επαληθευτή κλάσης.

Ο Bill Venners γράφει λογισμικό επαγγελματικά για 12 χρόνια. Με έδρα τη Silicon Valley, παρέχει υπηρεσίες παροχής συμβουλών και εκπαίδευσης λογισμικού με το όνομα Artima Software Company. Με τα χρόνια έχει αναπτύξει λογισμικό για τις βιομηχανίες ηλεκτρονικών ειδών ευρείας κατανάλωσης, εκπαίδευσης, ημιαγωγών και ασφάλισης ζωής. Έχει προγραμματίσει σε πολλές γλώσσες σε πολλές πλατφόρμες: γλώσσα συναρμολόγησης σε διάφορους μικροεπεξεργαστές, C στο Unix, C ++ σε Windows, Java στον Ιστό. Είναι συγγραφέας του βιβλίου: Inside the Java Virtual Machine, που εκδόθηκε από τον McGraw-Hill.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Το βιβλίο Η προδιαγραφή εικονικής μηχανής Java (//www.aw.com/cp/lindholm-yellin.html), των Tim Lindholm και Frank Yellin (ISBN 0-201-63452-X), μέρος της σειράς Java (//www.aw.com/cp /javaseries.html), από το Addison-Wesley, είναι η οριστική αναφορά εικονικής μηχανής Java.
  • Ασφαλής υπολογισμός με JavaNow και το μέλλον (μια λευκή βίβλος) // www.javasoft.com/marketing/collateral/security.html
  • Συχνές ερωτήσεις για την ασφάλεια Applet

    //www.javasoft.com/sfaq/

  • Ασφάλεια χαμηλού επιπέδου στην Java, από τον Frank Yellin //www.javasoft.com/sfaq/verifier.html
  • Η αρχική σελίδα ασφαλείας Java

    //www.javasoft.com/security/

  • Δείτε την αρχική σελίδα των εχθρικών εφαρμογών

    //www.math.gatech.edu/~mladue/HostileApplets.html

  • Το βιβλίο Java SecurityHostile Applets, τρύπες και αντίδοτα, από τον Δρ. Gary McGraw και τον Ed Felton, δίνει μια λεπτομερή ανάλυση των ζητημάτων ασφάλειας που περιβάλλουν την Java. //www.rstcorp.com/java-security.html
  • Προηγούμενα άρθρα "Under The Hood":
  • The Lean, Mean Virtual Machine - Παρουσιάζει την εικονική μηχανή Java.
  • The Java Class File Lifestyle - Δίνει μια επισκόπηση του αρχείου Java class, τη μορφή αρχείου στην οποία συντάσσονται όλα τα προγράμματα Java.
  • Java's Garbage- Collected Heap - Παρέχει μια επισκόπηση της συλλογής απορριμμάτων γενικά και του σωρού που συλλέγεται σκουπίδια της εικονικής μηχανής Java ειδικότερα.
  • Βασικά Bytecode - Παρουσιάζει τους bytecodes της εικονικής μηχανής Java και συζητά πρωτόγονους τύπους, λειτουργίες μετατροπής και συγκεκριμένες λειτουργίες στοίβας.
  • Floating Point Arithmetic - Περιγράφει την υποστήριξη κινητών σημείων της εικονικής μηχανής Java και τους bytecodes που εκτελούν λειτουργίες κινητής υποδιαστολής.
  • Λογική και αριθμητική - Περιγράφει την υποστήριξη της εικονικής μηχανής Java για λογική και ακέραια αριθμητική και τους σχετικούς bytecodes.
  • Αντικείμενα και πίνακες - Περιγράφει τον τρόπο με τον οποίο η εικονική μηχανή Java αντιμετωπίζει αντικείμενα και πίνακες και συζητά τους σχετικούς κωδικούς bytecodes.
  • Εξαιρέσεις - Περιγράφει τον τρόπο με τον οποίο η εικονική μηχανή Java αντιμετωπίζει εξαιρέσεις και συζητά τους σχετικούς κωδικούς bytecodes.
  • Δοκιμάστε-Τέλος - Περιγράφει τον τρόπο με τον οποίο η εικονική μηχανή Java εφαρμόζει ρήτρες δοκιμαστικού επιπέδου και συζητά τους σχετικούς κωδικούς bytecodes.
  • Control Flow - Περιγράφει τον τρόπο με τον οποίο η εικονική μηχανή Java εφαρμόζει τη ροή ελέγχου και συζητά τους σχετικούς bytecodes.
  • The Architecture of Aglets - Περιγράφει τις εσωτερικές λειτουργίες των aglets, την αυτόνομη τεχνολογία πράκτορα λογισμικού της IBM.
  • The Point of Aglets - Αναλύει την πραγματική χρησιμότητα κινητών πρακτόρων, όπως τα aglets, την αυτόνομη τεχνολογία πράκτορα λογισμικού της IBM.
  • Μέθοδος επίκλησης και επιστροφής - Περιγράφει τους τέσσερις τρόπους με τους οποίους η εικονική μηχανή Java χρησιμοποιεί τις μεθόδους, συμπεριλαμβανομένων των σχετικών κωδικών bytecodes.
  • Συγχρονισμός νημάτων - Δείχνει πώς λειτουργεί ο συγχρονισμός νημάτων στην εικονική μηχανή Java. Συζητά τους κωδικούς bytes για είσοδο και έξοδο από οθόνες.
  • Αρχιτεκτονική ασφάλειας Java - Δίνει μια επισκόπηση του μοντέλου ασφαλείας που είναι ενσωματωμένο στο JVM και εξετάζει τα ενσωματωμένα χαρακτηριστικά ασφαλείας του JVM.

Αυτή η ιστορία, "Ασφάλεια και αρχιτεκτονική φορτωτή τάξης" δημοσιεύθηκε αρχικά από την JavaWorld.