Sandbox

Το Sandbox παρέχει ένα επίπεδο ασφαλείας που σας δίνει τον έλεγχο του ποια tags, συναρτήσεις PHP, μέθοδοι κ.λπ. μπορούν να χρησιμοποιηθούν στα templates. Χάρη στη λειτουργία sandbox, μπορείτε να συνεργαστείτε με ασφάλεια με τον πελάτη ή έναν εξωτερικό κωδικοποιητή στη δημιουργία templates, χωρίς να χρειάζεται να ανησυχείτε για παραβίαση της εφαρμογής ή ανεπιθύμητες λειτουργίες.

Πώς λειτουργεί; Απλά ορίζουμε τι επιτρέπουμε στο template. Ενώ από προεπιλογή, όλα είναι απαγορευμένα και σταδιακά επιτρέπουμε πράγματα. Με τον ακόλουθο κώδικα, επιτρέπουμε στον συγγραφέα του template να χρησιμοποιεί τα tags {block}, {if}, {else} και {=}, που είναι το tag για εκτύπωση μεταβλητής ή έκφρασης και όλα τα φίλτρα:

$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);

$latte->setPolicy($policy);

Επιπλέον, μπορούμε να επιτρέψουμε μεμονωμένες συναρτήσεις, μεθόδους ή properties αντικειμένων:

$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);

Δεν είναι υπέροχο; Μπορείτε να ελέγχετε τα πάντα σε πολύ χαμηλό επίπεδο. Εάν το template προσπαθήσει να καλέσει μια μη επιτρεπόμενη συνάρτηση ή να αποκτήσει πρόσβαση σε μια μη επιτρεπόμενη μέθοδο ή property, θα καταλήξει σε εξαίρεση Latte\SecurityViolationException.

Η δημιουργία μιας πολιτικής από το μηδέν, όπου τα πάντα είναι απαγορευμένα, μπορεί να μην είναι βολική, γι' αυτό μπορείτε να ξεκινήσετε από μια ασφαλή βάση:

$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();

Η ασφαλής βάση σημαίνει ότι επιτρέπονται όλα τα τυπικά tags εκτός από τα contentType, debugbreak, dump, extends, import, include, layout, php, sandbox, snippet, snippetArea, templatePrint, varPrint, widget. Επιτρέπονται τα τυπικά φίλτρα εκτός από τα datastream, noescape και nocheck. Και τέλος, επιτρέπεται η πρόσβαση στις μεθόδους και τις properties του αντικειμένου $iterator.

Οι κανόνες εφαρμόζονται στο template που εισάγουμε με το tag {sandbox}. Το οποίο είναι κάτι σαν το {include}, αλλά ενεργοποιεί την ασφαλή λειτουργία και επίσης δεν περνάει καμία μεταβλητή:

{sandbox 'untrusted.latte'}

Έτσι, το layout και οι επιμέρους σελίδες μπορούν να χρησιμοποιούν ανεμπόδιστα όλα τα tags και τις μεταβλητές, μόνο στο template untrusted.latte θα εφαρμοστούν οι περιορισμοί.

Ορισμένες παραβάσεις, όπως η χρήση ενός απαγορευμένου tag ή φίλτρου, ανιχνεύονται κατά τη μεταγλώττιση. Άλλες, όπως η κλήση μη επιτρεπόμενων μεθόδων αντικειμένου, κατά το χρόνο εκτέλεσης. Το template μπορεί επίσης να περιέχει οποιαδήποτε άλλα σφάλματα. Για να μην μπορεί να προκύψει μια εξαίρεση από το sandbox template που θα διαταράξει ολόκληρη την απόδοση, μπορείτε να ορίσετε έναν προσαρμοσμένο χειριστή εξαιρέσεων, ο οποίος για παράδειγμα θα την καταγράψει.

Αν θέλαμε να ενεργοποιήσουμε τη λειτουργία sandbox απευθείας για όλα τα templates, είναι εύκολο:

$latte->setSandboxMode();

Για να βεβαιωθείτε ότι ο χρήστης δεν θα εισάγει κώδικα PHP στη σελίδα, ο οποίος είναι μεν συντακτικά σωστός, αλλά απαγορευμένος και προκαλεί PHP Compile Error, συνιστούμε να ελέγχετε τα templates με τον PHP linter. Αυτή η λειτουργία ενεργοποιείται με τη μέθοδο Engine::enablePhpLint(). Επειδή για τον έλεγχο χρειάζεται να καλέσει το εκτελέσιμο PHP, περάστε τη διαδρομή προς αυτό ως παράμετρο:

$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');
έκδοση: 3.0