Sandbox
Sandbox, şablonlarda hangi etiketlerin, PHP fonksiyonlarının, metotlarının vb. kullanılabileceğini kontrol etmenizi sağlayan bir güvenlik katmanı sağlar. Sandbox modu sayesinde, uygulamanın bozulması veya istenmeyen işlemler konusunda endişelenmeden şablon oluşturma konusunda müşteriyle veya harici kodlayıcıyla güvenli bir şekilde işbirliği yapabilirsiniz.
Nasıl çalışır? Basitçe şablona neye izin vereceğimizi tanımlarız. Varsayılan olarak her şey yasaktır ve biz yavaş
yavaş izin veririz. Aşağıdaki kod, şablon yazarının {block}
, {if}
, {else}
ve
{=}
etiketlerini (bu değişken veya ifade yazdırma
etiketidir) ve tüm filtreleri kullanmasına izin verir:
$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);
$latte->setPolicy($policy);
Ayrıca, bireysel fonksiyonlara, metotlara veya nesnelerin özelliklerine izin verebiliriz:
$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);
Harika değil mi? Her şeyi çok düşük bir seviyede tamamen kontrol edebilirsiniz. Şablon izin verilmeyen bir fonksiyonu
çağırmaya veya izin verilmeyen bir metoda veya özelliğe erişmeye çalışırsa,
Latte\SecurityViolationException
istisnasıyla sonuçlanır.
Politikayı her şeyin tamamen yasak olduğu sıfır noktasından oluşturmak uygun olmayabilir, bu nedenle güvenli bir temelden başlayabilirsiniz:
$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();
Güvenli temel, contentType
, debugbreak
, dump
, extends
,
import
, include
, layout
, php
, sandbox
, snippet
,
snippetArea
, templatePrint
, varPrint
, widget
dışındaki tüm standart
etiketlere izin verildiği anlamına gelir. datastream
, noescape
ve nocheck
dışındaki
standart filtrelere izin verilir. Ve son olarak, $iterator
nesnesinin metotlarına ve özelliklerine erişime izin
verilir.
Kurallar, {sandbox}
etiketiyle eklediğimiz
şablon için geçerlidir. Bu, {include}
'in bir tür benzeridir, ancak güvenli modu açar ve ayrıca hiçbir
değişken aktarmaz:
{sandbox 'guvenilmeyen.latte'}
Yani düzen ve bireysel sayfalar tüm etiketleri ve değişkenleri rahatsız edilmeden kullanabilir, yalnızca
guvenilmeyen.latte
şablonuna kısıtlamalar uygulanır.
Yasaklanmış bir etiket veya filtre kullanımı gibi bazı ihlaller derleme zamanında ortaya çıkar. Nesnenin izin verilmeyen metotlarının çağrılması gibi diğerleri ise çalışma zamanına kadar ortaya çıkmaz. Şablon ayrıca başka herhangi bir hata da içerebilir. Sandbox'lı şablondan tüm oluşturmayı bozacak bir istisnanın çıkmasını önlemek için, örneğin onu günlüğe kaydedecek özel bir özel istisna işleyici tanımlayabilirsiniz.
Sandbox modunu doğrudan tüm şablonlar için açmak istersek, bu kolaydır:
$latte->setSandboxMode();
Kullanıcının sayfaya sözdizimsel olarak doğru ancak yasaklanmış ve PHP Derleme Hatasına neden olacak PHP kodu
eklemediğinden emin olmak için, şablonları PHP
linter ile kontrol etme öneririz. Bu işlevselliği Engine::enablePhpLint()
metoduyla açarsınız. Kontrol
için PHP ikili dosyasını çağırması gerektiğinden, yolunu parametre olarak iletin:
$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');