Latte – render HTML s PHP proměnnou z databáze do šablony

Rndoom04
Člen | 72
+
+1
-

Zdravím. :)

Poradil by mi prosím někdo s filtrem v latte?

Jde o to, že administrátor webu může uložit do databáze nějaký html kód (ošetření proti js, iframe, atd, mám), který se má vyrenderovat v šabloně.

V databázi mám uloženo například toto:

<div class="trida">html tag</div>
<p>Další html tag</p>
{input nazev}

a rád bych to vypsal do šablony. Mohu použít filtr |noescape. Ten funguje bezvadně, jen ale nechá {input nazev} takhle, jak je a nevytvoří se z toho komponenta formu.

Pokud ten kód napíšu do šablony „napevno“, funguje. Řeším opravdu jen render stejného kódu, akorát z databáze.

Pro pochopení:
Toto mi to vyrenderuje: https://ibb.co/3sVm2DL
Toto chci: https://ibb.co/S6swtgr

Nějaké pošťouchnutí, na co zapomínám/co dělám špatně? :)

edit: Zkoušel jsem třeba i {input nazev} uložit do databáze jako %%input-nazev%% a pak přes str_replace to změnit na {input nazev}.

Děkuji a přeji krásný večer. :)

Editoval Rndoom04 (19. 2. 2019 21:43)

David Matějka
Moderator | 6445
+
0
-

ahoj, ukladat latte v databazi je bezpecnostni riziko, necha se v tom vykonat v podstate jakykoliv kod. Necha se to vsak udelat pomoci StringLoader (na foru jsou k tomu temata). Radeji bych ti ale doporucil tam dat nejaky custom placeholder a pres treba preg_replace_callback to nahradit za realny obsah

Rndoom04
Člen | 72
+
0
-

Ahoj,

děkuji za odpověď. Bezpečnostní riziko chápu. Přístup k tomu bude mít jen oprávněný uživatel, který bude vědět co a jak má dělat. A i tak mám udělané validace, aby nevznikaly zbytečné problémy. :) Takže si nebude moc vložit úplně co chce.

Každopádně mou pro něj použít, že bude vkládat něco jako %%input-nazev%% a ten se při renderu nahradí {form nazev}. Jen mi to nechce latte zpracovat. :/ Mohu poprosit o zaslání odkazů těch témat? Asi jsem hledal špatně, protože vlastně ani nevím, jak tento problém nazvat. :)

Děkuji :)

Kamil Valenta
Člen | 752
+
+2
-

Rndoom04 napsal(a):
Bezpečnostní riziko chápu. Přístup k tomu bude mít jen oprávněný uživatel, který bude vědět co a jak má dělat. A i tak mám udělané validace, aby nevznikaly zbytečné problémy. :) Takže si nebude moc vložit úplně co chce.

K tomu jen na okraj: měl bys počítat s tím, že případný útok rozhodně nemusí pocházet z nějakého formuláře v administraci. Data se mohou podvrhnout na úrovni DB, tedy za Tvou autorizací oprávněného a poučeného uživatele, za Tvými validacemi ukládaných dat.

Nebo ten poučený uživatel jednou zemře, nebo třeba bude jen dlouhodobě nemocný a nahradí ho někdo, kdo nebude poučen včas. Je mnoho důvodů, proč do DB neukládat kód k následujícímu vykonání.

David Matějka
Moderator | 6445
+
0
-

Každopádně mou pro něj použít, že bude vkládat něco jako %%input-nazev%% a ten se při renderu nahradí {form nazev}

Nemůžeš to přeložit na latte makro, to by se stejně muselo zpracovat latte kompilátorem. Latte funguje tak, že makra překládá při kompilaci na php kód, který se potom v runtime zpracuje. Ty musíš v tom nahrazení provést ekvivalentní php kód, který by provedla zkompilovaná šablona. Tady můžeš vidět, jak se překládá input makro. je to trochu kompilovanější, možná ti pomůže i nahlédnutí do zkompilované šablony.

Zjednodušeně chceš někde v presenteru provést ten preg_replace_callback, kde vrátíš něco jako $this['myForm'][$inputName]->getControl()