Κατακτήστε το globalThis σε JavaScript για ασφαλή απομόνωση περιβάλλοντος
Είναι επιτακτική ανάγκη να αποτραπεί η μη εξουσιοδοτημένη πρόσβαση στο καθολικό αντικείμενο κατά τη σύνταξη κώδικα JavaScript που αλληλεπιδρά με εξωτερικές ή μη αξιόπιστες εισόδους. Αυτό εγγυάται την ασφάλεια και τη συνέπεια του περιβάλλοντός σας. Μια σύγχρονη μέθοδος ελέγχου της παγκόσμιας εμβέλειας είναι μέσω του αντικείμενο.
Ο αντικείμενο. Κρίσιμα, μπορεί να διαμορφωθεί εκ νέου, τα sandbox ή τα ελεγχόμενα περιβάλλοντα εκτέλεσης μπορούν να δημιουργηθούν με την προσωρινή αντικατάστασή του.
Οι προγραμματιστές μπορούν να απομονώσουν την εκτέλεση κώδικα με αυτήν τη λειτουργία, η οποία είναι ιδιαίτερα χρήσιμη όταν εργάζεστε με μη αξιόπιστες εισόδους. Μπορούμε να στριμώξουμε τον κώδικα δημιουργώντας ένα μοναδικό καθολικό περιβάλλον, το οποίο θα επιτρέπει την πρόσβαση μόνο σε ένα προκαθορισμένο σύνολο μεταβλητών, αποτρέποντας παράλληλα την έκθεση στο υπόλοιπο του καθολικού αντικειμένου.
Αυτό το άρθρο θα συζητήσει τον τρόπο χρήσης και μονάδες ES6 για την κατασκευή ενός sandbox. Θα παρουσιάσω μια απόδειξη της ιδέας που αντικαθιστά στιγμιαία το παγκόσμιο πλαίσιο για να εγγυηθεί την ασφαλή εκτέλεση κώδικα σε μια ρυθμιζόμενη ρύθμιση.
Εντολή | Παράδειγμα χρήσης |
---|---|
globalThis | myContext = globalThis; - είναι ένα μοναδικό αντικείμενο που προσφέρει μια καθολική αναφορά στο παγκόσμιο αντικείμενο. Εδώ, αντικαθίσταται για την εξομοίωση ενός sandbox και τη δημιουργία ενός μοναδικού παγκόσμιου εύρους. |
Proxy | ας mySandbox = νέος διακομιστής μεσολάβησης (sandboxHandler, myContext); - Οι λειτουργίες του αντικειμένου AA μπορούν να υποκλαπούν και να επαναπροσδιοριστούν μέσω ενός διακομιστή μεσολάβησης. Σε αυτό το παράδειγμα, η πρόσβαση στις μεταβλητές περιβάλλοντος του sandbox μπορεί να ελεγχθεί. |
get | get: (target, prop) =>παίρνω: (στόχος, στήριγμα) => { ... } - Το παγίδα στο διακομιστή μεσολάβησης παρεμποδίζει τις προσπάθειες πρόσβασης στις ιδιότητες του αντικειμένου sandbox, διασφαλίζοντας ότι επιστρέφονται μόνο οι επιτρεπόμενες ιδιότητες, ρίχνοντας σφάλματα για απροσδιόριστες. |
finally | Τέλος GlobalThis ισούται με savedGlobal. - Είτε παρουσιαστεί σφάλμα κατά την εκτέλεση είτε όχι, το Το μπλοκ διασφαλίζει ότι η ακεραιότητα του καθολικού αντικειμένου διατηρείται με την επαναφορά του αρχικού καθολικού περιβάλλοντος. |
ReferenceError | «Η ιδιοκτησία δεν έχει οριστεί». ρίχνει νέο Σφάλμα αναφοράς. - Α εκπέμπεται χειροκίνητα για να χειριστεί περιπτώσεις όπου γίνεται προσπάθεια πρόσβασης σε απροσδιόριστες μεταβλητές εντός του sandbox, βελτιώνοντας την ασφάλεια αποτρέποντας την απροσδόκητη πρόσβαση. |
IIFE | ((globalThis) =>((globalThis) => { ... })(globalThis); - Αν Το (Immediately Invoked Function Expression) χρησιμοποιείται για τη δημιουργία ενός τοπικού πεδίου, προστατεύοντας το καθολικό αντικείμενο από ακούσια έκθεση κατά την εκτέλεση του κώδικα sandbox. |
try...catch | «Η ιδιοκτησία δεν έχει οριστεί». ρίχνει νέο Σφάλμα αναφοράς. - Α εκπέμπεται χειροκίνητα για να χειριστεί περιπτώσεις όπου γίνεται προσπάθεια πρόσβασης σε απροσδιόριστες μεταβλητές εντός του sandbox, βελτιώνοντας την ασφάλεια αποτρέποντας την απροσδόκητη πρόσβαση. |
savedGlobal | «Η ιδιοκτησία δεν έχει οριστεί». ρίχνει νέο Σφάλμα αναφοράς. - Α εκπέμπεται χειροκίνητα για να χειριστεί περιπτώσεις όπου γίνεται προσπάθεια πρόσβασης σε απροσδιόριστες μεταβλητές εντός του sandbox, βελτιώνοντας την ασφάλεια αποτρέποντας την απροσδόκητη πρόσβαση. |
Χτίζοντας ένα ασφαλές παγκόσμιο πλαίσιο με τις ενότητες ES6 και το globalThis
Ο πρωταρχικός στόχος των σεναρίων που προσφέρονται είναι να παρέχουν α όπου το παγκόσμιο αντικείμενο () αντικαθίσταται προσωρινά. Αυτή η μέθοδος σάς επιτρέπει να κρατάτε κρυφές σημαντικές μεταβλητές ή ιδιότητες από το αρχικό καθολικό αντικείμενο, κάτι που είναι πολύ χρήσιμο όταν εργάζεστε με εξωτερικό ή μη αξιόπιστο κώδικα. Ο επαναπροσδιορισμός του καθολικού εύρους διασφαλίζει καλύτερο έλεγχο της μεταβλητής πρόσβασης περιορίζοντας ουσιαστικά τον κώδικα στην πρόσβαση μόνο στις ιδιότητες που δηλώνονται στο sandbox.
Αποθήκευση του πρωτοτύπου σε μια τοπική μεταβλητή () είναι το πρώτο βήμα στη διαδικασία στο πρώτο παράδειγμα. Αυτό είναι ένα σημαντικό βήμα γιατί, μόλις εκτελεστεί ο κώδικας sandbox, θα αποκατασταθεί το καθολικό πλαίσιο. Με την αντικατάσταση του καθολικού περιβάλλοντος με ένα νέο αντικείμενο (εδώ, ), το σενάριο προσπαθεί να ανακτήσει μεταβλητές (εδώ, ένα και ) που βρίσκεται σε αυτό το sandbox. Όπως καταδεικνύεται στο πρώτο τεύχος που αναφέρθηκε, δημιουργείται ένα σφάλμα αναφοράς εάν δεν προσδιορίζονται ορισμένες μεταβλητές. Τέλος, το Το μπλοκ διασφαλίζει ότι, κατά την εκτέλεση, το γενικό πλαίσιο αποκαθίσταται πάντα, αποφεύγοντας τυχόν απροσδόκητες επιπτώσεις σε άλλους τομείς της εφαρμογής.
Η δεύτερη προσέγγιση κάνει χρήση του α αντιτίθενται στη βελτίωση αυτής της διαδικασίας. Στο JavaScript, ένας διακομιστής μεσολάβησης επιτρέπει στους προγραμματιστές να ερμηνεύουν ξανά και να παρεμποδίζουν τις ενέργειες που γίνονται σε αντικείμενα. Μέσα σε αυτό το σενάριο, ο διακομιστής μεσολάβησης παρακολουθεί αιτήματα για πρόσβαση στην ιδιότητα και καθορίζει εάν η επιθυμητή ιδιότητα υπάρχει στο αντικείμενο sandbox. ΕΝΑ απορρίπτεται σε περίπτωση που το ακίνητο δεν μπορεί να εντοπιστεί, διασφαλίζοντας ότι δεν υπάρχει πρόσβαση σε εξωτερικές μεταβλητές. Εξαιτίας αυτού, είναι μια ισχυρή επιλογή για την εξασφάλιση του καθολικού εύρους και τη διαχείριση της μεταβλητής πρόσβασης σε μια ρύθμιση δυναμικού sandbox.
Προκειμένου να απομονωθεί πλήρως η εκτέλεση του sandbox, η τρίτη δέσμη ενεργειών χρησιμοποιεί μια έκφραση IIFE (Άμεση κλήση συνάρτησης). Είναι δύσκολο για εξωτερικό κώδικα να έχει πρόσβαση ή να παρεμβαίνει στο παγκόσμιο πλαίσιο, επειδή το μοτίβο IIFE περικλείει ολόκληρη τη δράση μέσα στο δικό του τοπικό πεδίο. Αυτή η μέθοδος είναι πιο ασφαλής επειδή το globalThis δεν εκτίθεται στον έξω κόσμο και μεταβάλλεται μόνο εντός του IIFE. Με την εγγύηση ότι όλος ο κώδικας sandbox λειτουργεί σε ένα εντελώς διαχωρισμένο περιβάλλον, ενισχύει την ασφάλεια και τη συνέπεια στη λειτουργία του σεναρίου.
Δημιουργία Sandbox με μονάδες ES6 για τη διαχείριση του παγκόσμιου περιβάλλοντος JavaScript
Αυτή η μέθοδος αντικαθιστά για τη δημιουργία ενός sandbox που διατηρεί με ασφάλεια το παγκόσμιο περιβάλλον χρησιμοποιώντας JavaScript (ES6). Προσφέρει μια απλή απόδειξη της ιδέας για δυναμικές εφαρμογές front-end.
let myContext = { a: 1, b: 2 };
let f = () => {
let savedGlobal = globalThis; // Save the original globalThis
globalThis = myContext; // Overwrite globalThis with the sandbox context
try {
let result = a + b; // Attempt to access a and b within the sandbox
return result; // Return the calculated result
} catch (e) {
console.error(e); // Catch errors, such as reference errors
} finally {
globalThis = savedGlobal; // Restore the original global context
}
};
console.log(f());
Βελτιωμένη λύση: Χρήση διακομιστή μεσολάβησης για παρεμπόδιση της καθολικής πρόσβασης
Αυτή η τεχνική αποτρέπει την ακούσια έκθεση μεταβλητών χρησιμοποιώντας ένα αντικείμενο Proxy για την παρεμπόδιση της καθολικής πρόσβασης περιβάλλοντος, βελτιώνοντας την ασφάλεια και τη σπονδυλωτή. Κατάλληλο για χρήση σε ρυθμίσεις front-end και back-end JavaScript.
const myContext = { a: 1, b: 2 };
const sandboxHandler = {
get: (target, prop) => {
if (prop in target) {
return target[prop];
} else {
throw new ReferenceError(\`Property \${prop} is not defined\`);
}
}
};
let mySandbox = new Proxy(myContext, sandboxHandler);
let f = () => {
let savedGlobal = globalThis;
globalThis = mySandbox; // Overwrite with sandbox proxy
try {
let result = a + b; // Access sandbox variables safely
return result;
} catch (e) {
console.error(e);
} finally {
globalThis = savedGlobal; // Restore global context
}
};
console.log(f());
Λύση με IIFE για καλύτερη απομόνωση περιβάλλοντος
Αυτή η μέθοδος ενσωματώνει πλήρως το περιβάλλον sandbox χρησιμοποιώντας μια Έκφραση Συνάρτησης Άμεσης Κλήσης (IIFE). Εγγυάται ότι οι μεταβλητές που δεν βρίσκονται εντός του καθορισμένου περιβάλλοντος δεν είναι καθόλου προσβάσιμες.
((globalThis) => {
const myContext = { a: 1, b: 2 };
const f = () => {
let result = myContext.a + myContext.b; // Access sandbox variables directly
return result;
};
console.log(f()); // Log the result of the sandboxed function
})(globalThis);
Επέκταση της χρήσης προσαρμοσμένου καθολικού περιβάλλοντος στο JavaScript Sandboxing
Άλλο ένα όφελος από την απασχόληση σε κατάσταση sandboxing. Στην ουσία, επαναδρομολογείτε την έμφαση του κώδικά σας σε μια ελεγχόμενη συλλογή μεταβλητών όταν αντικαθιστάτε το καθολικό αντικείμενο με ένα προσαρμοσμένο περιβάλλον, όπως φαίνεται στο παράδειγμά μας. Όταν εκτελείτε μη αξιόπιστα σενάρια τρίτων κατασκευαστών ή διαχωρίζετε ξεχωριστές λειτουργικές μονάδες μιας μεγάλης διαδικτυακής εφαρμογής, αυτή η στρατηγική μπορεί να είναι ιδιαίτερα χρήσιμη για την αποτροπή της αλληλομόλυνσης μεταβλητών.
Το γεγονός ότι το σύστημα μονάδων ES6 στο JavaScript έχει ενσωματωμένες τεχνικές οριοθέτησης που διαχωρίζουν μερικώς τις μεταβλητές είναι ένα άλλο κρίσιμο στοιχείο. Από την άλλη, χρησιμοποιώντας μας δίνει τη δυνατότητα να προχωρήσουμε πέρα από αυτό. Αποτρέποντας τα σενάρια που δεν θα πρέπει να έχουν πρόσβαση σε αυτό από το να δουν το αρχικό καθολικό πλαίσιο, αυτό όχι μόνο ενισχύει την ασφάλεια αλλά βοηθά επίσης στην αποφυγή ακούσιων αντικαταστάσεων καθολικών μεταβλητών. Αυτή η μέθοδος λειτουργεί καλά για την προστασία εφαρμογών από κακόβουλο ή κακογραμμένο κώδικα.
Συνδυασμός μονάδων ES6 με βελτιώνει ακόμη περισσότερο την ασφάλεια σε καταστάσεις όπου χρειάζεστε λεπτομερή έλεγχο σχετικά με τα στοιχεία της εφαρμογής σας που έχουν πρόσβαση στο καθολικό αντικείμενο. Φιλτράροντας την πρόσβαση σε συγκεκριμένες ιδιότητες εντός του καθολικού αντικειμένου, οι διακομιστής μεσολάβησης σάς επιτρέπουν να βεβαιωθείτε ότι είναι δυνατή η πρόσβαση μόνο στις ιδιότητες που επιτρέπονται. Τα δεδομένα κάθε μισθωτή σε μια εφαρμογή πολλαπλών ενοικιαστών πρέπει να διαχωριστούν πλήρως από τα δεδομένα των άλλων ενοικιαστών. Αυτή η λύση είναι επεκτάσιμη και προσαρμόσιμη σε διάφορες περιπτώσεις χρήσης.
- Ποιος είναι ο ρόλος του σε JavaScript;
- «Η ιδιοκτησία δεν έχει οριστεί». ρίχνει νέο Σφάλμα αναφοράς. - Α εκπέμπεται χειροκίνητα για να χειριστεί περιπτώσεις όπου γίνεται προσπάθεια πρόσβασης σε απροσδιόριστες μεταβλητές εντός του sandbox, βελτιώνοντας την ασφάλεια αποτρέποντας την απροσδόκητη πρόσβαση.
- Γιατί το sandboxing είναι σημαντικό στο JavaScript;
- Η προστασία ευαίσθητων μεταβλητών, ο περιορισμός της πρόσβασης μη εξουσιοδοτημένων προγραμμάτων στο καθολικό αντικείμενο και η απομόνωση της εκτέλεσης κώδικα γίνονται όλα δυνατά μέσω του sandboxing.
- Πώς το αντικείμενο βελτίωσης της ασφάλειας του sandbox;
- ΕΝΑ είναι ένα αποτελεσματικό εργαλείο για την ασφάλεια περιβάλλοντος sandbox επειδή μπορεί να παρεμποδίσει τις προσβάσεις σε ιδιότητες και να περιορίσει την πρόσβαση μόνο σε προκαθορισμένες ιδιότητες.
- Πώς μπορεί ένα IIFE να βοηθήσει στην απομόνωση παγκόσμιων πλαισίων και τι σημαίνει;
- Μια IIFE (Immediately Invoked Function Expression) ενσωματώνει την εκτέλεση κώδικα, αποτρέποντας την εξωτερική πρόσβαση στο καθολικό αντικείμενο και διασφαλίζοντας την πλήρη απομόνωση του sandbox.
- Μια IIFE (Immediately Invoked Function Expression) απομονώνει την εκτέλεση κώδικα, απαγορεύοντας την εξωτερική πρόσβαση στο καθολικό αντικείμενο και παρέχοντας πλήρη απομόνωση του sandbox.
- Δεν συνιστάται η χρήση του καταργημένου δήλωση. Σύγχρονα υποκατάστατα όπως και τα αντικείμενα προσφέρουν πιο αξιόπιστες και ασφαλείς επιλογές.
Τελικές σκέψεις σχετικά με τη δημιουργία ενός ασφαλούς JavaScript Sandbox
Ρύθμιση sandbox χρησιμοποιώντας το globalThis στις μονάδες ES6 είναι μια αποτελεσματική τεχνική για τη διαχειρίσιμη και ασφαλή ρύθμιση της μεταβλητής πρόσβασης. Καθιστά δυνατή την ασφαλέστερη εκτέλεση μη αξιόπιστου κώδικα και εγγυάται την προστασία των κρίσιμων καθολικών μεταβλητών.
Αυτή η μέθοδος επιτρέπει στους προγραμματιστές να τροποποιούν πλήρως και να ελέγχουν το παγκόσμιο περιβάλλον τους όταν χρησιμοποιείται με . Αυτή η τεχνική δημιουργεί ένα ασφαλέστερο περιβάλλον αποτρέποντας τη μη εξουσιοδοτημένη πρόσβαση σε μεταβλητές που δεν βρίσκονται σε περιβάλλον δοκιμών —ειδικά σε περίπλοκα συστήματα ή συστήματα πολλαπλών μισθωτών.
- Αναλυτική τεκμηρίωση για το αντικείμενο και η χρήση του αναφέρθηκε από τα Έγγραφα Ιστού MDN. Εξηγεί πώς παρέχει μια καθολική αναφορά στο καθολικό αντικείμενο και πώς μπορεί να αντικατασταθεί για λόγους ασφαλείας. MDN Web Docs - globalThis
- Οδηγίες για τη χρήση αντικείμενα για την ενίσχυση της ασφάλειας του sandboxing και της πρόσβασης παρεμπόδισης στις ιδιότητες αντικειμένων προσαρμόστηκε από την επίσημη τεκμηρίωση του ECMAScript. Αντικείμενα διακομιστή μεσολάβησης ECMAScript
- Οι γενικές έννοιες σχετικά με το sandboxing και την απομόνωση περιβάλλοντος σε JavaScript για τη βελτίωση της ασφάλειας εφαρμογών Ιστού εξετάστηκαν από τις οδηγίες OWASP για ασφαλείς πρακτικές κωδικοποίησης. Πρακτικές Ασφαλούς Κωδικοποίησης OWASP