Sandbox
Το Sandbox παρέχει ένα επίπεδο ασφαλείας που σας δίνει τον έλεγχο του ποια tags, συναρτήσεις PHP, μέθοδοι κ.λπ. μπορούν να χρησιμοποιηθούν στα πρότυπα. Χάρη στη λειτουργία sandbox, μπορείτε να συνεργαστείτε με ασφάλεια με τον πελάτη ή έναν εξωτερικό κωδικοποιητή στη δημιουργία προτύπων, χωρίς να χρειάζεται να ανησυχείτε για παραβίαση της εφαρμογής ή ανεπιθύμητες λειτουργίες.
Πώς λειτουργεί; Απλά ορίζουμε τι επιτρέπουμε στο πρότυπο. Ενώ από
προεπιλογή, όλα είναι απαγορευμένα και σταδιακά επιτρέπουμε πράγματα.
Με τον ακόλουθο κώδικα, επιτρέπουμε στον συγγραφέα του προτύπου να
χρησιμοποιεί τα tags {block}
, {if}
, {else}
και {=}
, που
είναι το tag για εκτύπωση μεταβλητής ή έκφρασης και
όλα τα φίλτρα:
Επιπλέον, μπορούμε να επιτρέψουμε μεμονωμένες συναρτήσεις, μεθόδους ή properties αντικειμένων:
Δεν είναι υπέροχο; Μπορείτε να ελέγχετε τα πάντα σε πολύ χαμηλό
επίπεδο. Εάν το πρότυπο προσπαθήσει να καλέσει μια μη επιτρεπόμενη
συνάρτηση ή να αποκτήσει πρόσβαση σε μια μη επιτρεπόμενη μέθοδο ή property,
θα καταλήξει σε εξαίρεση Latte\SecurityViolationException
.
Η δημιουργία μιας πολιτικής από το μηδέν, όπου τα πάντα είναι απαγορευμένα, μπορεί να μην είναι βολική, γι' αυτό μπορείτε να ξεκινήσετε από μια ασφαλή βάση:
Η ασφαλής βάση σημαίνει ότι επιτρέπονται όλα τα τυπικά tags εκτός από
τα contentType
, debugbreak
, dump
, extends
, import
,
include
, layout
, php
, sandbox
, snippet
, snippetArea
,
templatePrint
, varPrint
, widget
. Επιτρέπονται τα τυπικά φίλτρα
εκτός από τα datastream
, noescape
και nocheck
. Και τέλος,
επιτρέπεται η πρόσβαση στις μεθόδους και τις properties του αντικειμένου
$iterator
.
Οι κανόνες εφαρμόζονται για το πρότυπο που εισάγουμε με το tag {sandbox}
. Το οποίο είναι κάτι σαν το
{include}
, αλλά ενεργοποιεί την ασφαλή λειτουργία και επίσης δεν
περνάει καμία μεταβλητή:
Έτσι, το layout και οι επιμέρους σελίδες μπορούν να χρησιμοποιούν
ανεμπόδιστα όλα τα tags και τις μεταβλητές, μόνο στο πρότυπο
untrusted.latte
θα εφαρμοστούν οι περιορισμοί.
Ορισμένες παραβάσεις, όπως η χρήση ενός απαγορευμένου tag ή φίλτρου, ανιχνεύονται κατά τη μεταγλώττιση. Άλλες, όπως η κλήση μη επιτρεπόμενων μεθόδων αντικειμένου, κατά το χρόνο εκτέλεσης. Το πρότυπο μπορεί επίσης να περιέχει οποιαδήποτε άλλα σφάλματα. Για να μην μπορεί να προκύψει μια εξαίρεση από το sandbox πρότυπο που θα διαταράξει ολόκληρη την απόδοση, μπορείτε να ορίσετε έναν προσαρμοσμένο χειριστή εξαιρέσεων, ο οποίος για παράδειγμα θα την καταγράψει.
Αν θέλαμε να ενεργοποιήσουμε τη λειτουργία sandbox απευθείας για όλα τα πρότυπα, είναι εύκολο:
Για να βεβαιωθείτε ότι ο χρήστης δεν θα εισάγει κώδικα PHP στη σελίδα, ο
οποίος είναι μεν συντακτικά σωστός, αλλά απαγορευμένος και προκαλεί PHP
Compile Error, συνιστούμε να ελέγχετε τα
πρότυπα με τον PHP linter. Αυτή η λειτουργία ενεργοποιείται με τη μέθοδο
Engine::enablePhpLint()
. Επειδή για τον έλεγχο χρειάζεται να καλέσει το
εκτελέσιμο PHP, περάστε τη διαδρομή προς αυτό ως παράμετρο: