Latte – render HTML s PHP proměnnou z databáze do šablony
- Rndoom04
- Člen | 75
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
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 | 75
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 | 822
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
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()