Escapování helperu s více výstupními HTML elementy
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- kaspi
- Člen | 1
Zdravím,
jakým způsobem byste napsali následující helper tak, aby se neescapoval při jeho volání?
public static function submenu_item($link, $title)
{
return
<<<ITEM
<td class="sub-left"></td>
<td class="sub-item"><a href="$link">$title</a></td>
<td class="sub-right"></td>
ITEM;
}
Příklad volání:
{link Files:upload|submenu_item:'Nahrát soubor'}
Díky za rady…
- Jan Tvrdík
- Nette guru | 2595
Ten helper obsahuje potenciální XSS zranitelnost, protože nescapuješ
$link
a $title
.
- uestla
- Backer | 799
Řešení je v komponentě:
components/SubMenuItem.php
use Nette\Application\UI;
class SubMenuItem extends UI\Control
{
function render($link, $title)
{
$this->template->setFile(__DIR__ . '/SubMenuItem.latte');
$this->template->link = $link;
$this->template->title = $title;
$this->template->render();
}
}
components/SubMenuItem.latte
<td class="sub-left"></td>
<td class="sub-item"><a href="{$link}">{$title}</a></td>
<td class="sub-right"></td>
Továrnička na komponentu (v presenteru či v jiné komponentě):
protected function createComponentSubMenuItem()
{
return new UI\Multiplier(function ($name) {
return new SubMenuItem();
});
}
A použití v šabloně:
{control subMenuItem-ahoj $control->link('Files:upload'), 'Nahrát soubor'}
Doufám, že je to správně – psal jsem na sucho.
- uestla
- Backer | 799
Další možnost – jelikož je nehezké helperem generovat složitější HTML strukturu – je využít bloků…
{define subMenuItem}
<td class="sub-left"></td>
<td class="sub-item"><a href="{$link}">{$title}</a></td>
<td class="sub-right"></td>
{/define}
A vkládat:
{include #subMenuItem, link => $control->link('Files:upload'), 'Nahrát soubor'}
Nemusíš pro úpravu lézt někam do helperovníku, je to pěkně v šabloně, kde to být má, navíc hezky rozšiřitelné a hlavně ochráněné díky Latte (jak psal Honza výše).
Editoval uestla (24. 4. 2012 20:31)