Context-aware escaping bug?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Keksa
Člen | 23
+
0
-

PHP 5.3.8
Nette 2.0 stable

Tento latte zápis:

{if $data['color']}style="color: {$data['color']};"{/if}

Vygeneruje tento kód:

style="color: \#666666;"

A tím pádem je css vlastnost color nefunkční, možný bug escapování? Proměnná je string „#666666“ (7).

Nox
Člen | 378
+
0
-

Escapování zařídí, že daný řetězec není brán v kontextu daného jazyka. Z tohoto pohledu je to správně.

Takže bych asi použil ! a použil nějaký helper na html-only escapování,resp. asi napsat

uestla
Backer | 796
+
0
-

HTML

<div n:class="$data['color'] ? devilcolor">Odstup, Satane!</div>

CSS

.devilcolor {
	color: #666;
}
Filip Procházka
Moderator | 4668
+
0
-

Souhlasím, že je lepší použít třídy, protože HTML je na obsah, né na styly. Na druhou stranu, Latte by to mohlo umět.

Založil jsem za vás issue ;)

Editoval HosipLan (7. 2. 2012 18:26)

Elijen
Člen | 171
+
0
-

On je pak trochu problem, kdyz chcete mit barvy dynamicky nastavitelne napr. v administraci. Sel by generovat CSS soubor + tridy, ale tohle je radove jednodussi (nerikam, ze cistsi) :-)

Semik
Backer | 135
+
0
-

HosipLan napsal(a):

Souhlasím, že je lepší použít třídy, protože HTML je na obsah, né na styly. Na druhou stranu, Latte by to mělo umět.

Založil jsem za vás issue ;)

„issue“ byl rychle vyřešen s překvapivou odpovědí :-)

Keksa
Člen | 23
+
0
-

Jop, pomocí {!$data[color]} sem to vyřešil taky, šlo mi jenom o to, aby se případně opravil bug v Nette. Css třídu bohužel použít nemůžu, protože je to do chatové aplikace, kde si každý uživatel může nastavit barvu, aby se lépe odlišoval od ostatních. Takže bych musel udělat css třídy pro veškeré barvy a to je vážně kravina. Nejspíš by to šlo nějak udělat například pomocí nějakého generovaného css souboru, ale to už mi přijde zbytečně krkolomné.

uestla
Backer | 796
+
0
-

Stejně mám pocit, že to není bug, jen to špatně chápeme…

Jsme v kontextu CSS, kde má # speciální význam. Když to chcem vypsat natvrdo, jak to je, použijem vykřičník… Čili je to stejný mechanismus, jako když v HTML kontextu vypisujem HTML uložené v proměnné, nebo ne?

Keksa
Člen | 23
+
0
-

uestla napsal(a):

Stejně mám pocit, že to není bug, jen to špatně chápeme…

Jsme v kontextu CSS, kde má # speciální význam. Když to chcem vypsat natvrdo, jak to je, použijem vykřičník… Čili je to stejný mechanismus, jako když v HTML kontextu vypisujem HTML uložené v proměnné, nebo ne?

Jenže pokud styl zapisuju přímo pro daný element pomocí atributu „style“, tak pokud vím ‚#‘ speciální význam nemá.

Nox
Člen | 378
+
0
-

Do style píšeš CSS, ne? Takže dál viz uestla

Fakt se koukni trochu přesněji, co to znamená „escapování“, nevím jak to popsat jinak, než jak jsem psal

Editoval Nox (8. 2. 2012 20:19)

mkoubik
Člen | 728
+
0
-

Dalo by se to brát jako jakýkoliv HTML atrubut, ale předpokládám že v onClick bys taky chtěl (pokud bys něco takovýho používal) aby ti to escapovalo javascript, takže IMHO to bug není.

Keksa
Člen | 23
+
0
-

Nox napsal(a):

Do style píšeš CSS, ne? Takže dál viz uestla

Fakt se koukni trochu přesněji, co to znamená „escapování“, nevím jak to popsat jinak, než jak jsem psal

Jo takhle, sorry, nějak sem tvůj předchozí příspěvek přehlídnul. My bad, už to chápu. :)

uestla
Backer | 796
+
0
-

Ale Nox má zřejmě pravdu, že by se to ještě mělo prohnat htmlspecialchars, ni?

{!$data['color']|escape}
David Grudl
Nette Core | 8129
+
0
-

To je dobrá otázka, co má v CSS speciální význam.

Odpověď je tady. Nicméně CSS má řadu různých kontextů a je otázka, co se od escapování očekává. Nette volí tu nejpřísnější cestu. To znamená, že mohu mít $id='a#b'; obsahující mřížku a <span id='{$id}'> a na něj se odkazovat ve `<style> $id { ... }</style>.