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
+
0
-

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…

JuniorJR
Člen | 181
+
0
-

Zkusil bych

{!link Files:upload|submenu_item:'Nahrát soubor'}
Jan Tvrdík
Nette guru | 2595
+
0
-

Ten helper obsahuje potenciální XSS zranitelnost, protože nescapuješ $link a $title.

uestla
Backer | 799
+
0
-

Ř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
+
0
-

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)

duke
Člen | 650
+
0
-

@kaspi Automatickému escapování se vyhneš také tak, že místo řetězce vrátíš Nette\Utils\Html objekt. Automaticky to neescapuje také objekty šablon a formulářů.