Sandbox

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

Η λειτουργία sandbox φροντίζει να μην βγει η άμμος από το κουτί. Έτσι, παρέχει περιορισμένη πρόσβαση σε ετικέτες, φίλτρα, συναρτήσεις, μεθόδους κ.λπ. Πώς λειτουργεί; Απλά ορίζουμε τι θέλουμε να επιτρέψουμε στο πρότυπο. Στην αρχή, τα πάντα απαγορεύονται και σταδιακά παραχωρούμε δικαιώματα:

Ο παρακάτω κώδικας επιτρέπει στο πρότυπο να χρησιμοποιεί τις ετικέτες {block}, {if}, {else} και {=} (η τελευταία είναι μια ετικέτα για την εκτύπωση μιας μεταβλητής ή έκφρασης) και όλα τα φίλτρα:

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

$latte->setPolicy($policy);

Μπορούμε επίσης να επιτρέψουμε την πρόσβαση σε παγκόσμιες συναρτήσεις, μεθόδους ή ιδιότητες αντικειμένων:

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

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

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

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

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

Οι κανόνες ισχύουν για το πρότυπο που εισάγουμε με το νέο {sandbox} ετικέτα. Το οποίο είναι κάτι σαν το {include}, αλλά ενεργοποιεί τη λειτουργία sandbox και επίσης δεν περνάει εξωτερικές μεταβλητές:

{sandbox 'untrusted.latte'}

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

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

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

$latte->setSandboxMode();