Sandbox
Το Sandbox παρέχει ένα επίπεδο ασφαλείας που σας δίνει τον έλεγχο των ετικετών, των συναρτήσεων PHP, των μεθόδων κ.λπ. που μπορούν να χρησιμοποιηθούν στα πρότυπα. Χάρη στη λειτουργία 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();
Για να διασφαλίσετε ότι ένας χρήστης δεν εισάγει κώδικα PHP στη σελίδα που είναι συντακτικά σωστός αλλά απαγορευμένος και προκαλεί σφάλμα μεταγλώττισης PHP, συνιστούμε να ελέγχετε τα πρότυπα από τον παρεμβλητή PHP. Μπορείτε να ενεργοποιήσετε αυτή τη λειτουργία χρησιμοποιώντας τη μέθοδο Engine::enablePhpLint(). Δεδομένου ότι χρειάζεται να καλέσει το δυαδικό αρχείο PHP για τον έλεγχο, περάστε τη διαδρομή του ως παράμετρο:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');