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');
versiyon: 3.0