Tento blog je v současné době uzavřen.
Pokračování blogu na bloguje.cz jsem zrušil. Pokud budu někdy pokračovat, bude to spíš tady.
Není úplně jedno, jestli hodnoty atributů v (X)HTML uvádět v uvozovkách, nebo v apostrofech. Podle Yuhůa se může obojí (a validátor apostrofy místo uvozovek bez potíží skousne i pro XHTML Strict 1.0), specifikace hovoří jen o uvozovkách. No, každopádně uvozovky přinesou méně potíží. Aspoň tedy u atributu value v prvcích formuláře.
Příklad: mám formulář pro opravu údajů. Z databáze načtu aktuální údaje a chci jimi formulář předvyplnit. A protože jsem cosi slyšel o nebezpečných znacích pro HTML, nezapomenu text prohnat funkcí htmlspecialchars. Zjednodušeně třeba takto:
<?php $jmeno = htmlspecialchars($jmeno); ?> <input type='text' name='jmeno' value='<?php echo $jmeno;?>'>
Chytří už vědí, že jméno obsahující apostrof (např. O'Brien) mi nadělá pěknou paseku. Funkce htmlspecialchars totiž standardně změní jen uvozovky, kdežto apostrofy nechá být. Musí se použít htmlspecialchars($jmeno,ENT_QUOTES).
No co, tak přidáme parametr do funkce. Ale někdy se to tak snadno ovlivnit nedá. Používám jednoduchý šablonovací systém HTMLTMPL, který při výstupu sice nebezpečné znaky převádí automaticky, ale na apostrofy prostě kašle (resp. neumím ho donutit, aby nekašlal).
Mít místo apostrofu uvozovky je daleko jistější. Do konstrukce
<?php $jmeno = htmlspecialchars($jmeno); ?> <input type="text" name="jmeno" value="<?php echo $jmeno;?>">
se apostrof vpustit nebojím, i když se nepřevede.
Vložit vlastní komentář – Návrat k článku – RSS komentářů tohoto článku
[1] 7. 11. 2006, 09:44 – nestojí za řeč
Ten příspěvek je psán v duchu, jakoby nic jinýho než to hnusný starý PHP neexistovalo a všem bylo okamžitě jasný, s čím má dotyčný vlastně problém...
[2] 7. 11. 2006, 10:08 – Věroš Kaplan (Odkaz)
Uvážíme-li, že XHTML je postaveno na XML a podíváme-li se na http://www.w3.org/TR/REC-xml/#NT-AttValue
[3] 7. 11. 2006, 10:18 – LLaik
Automaticky prevod "nebezpecnych" znaku? A co kdyz je nechces "zabezpecit"? To je pak trosku trable, ne? :)
[1] hnusne stare..? Jejda, to zni konstruktivne :)
[4] 7. 11. 2006, 10:20 – Honza Hučín (Odkaz)
Ad [1]: Na PHP článek nestojí. Zkus si místo něho dosadit jiný serverový skriptovací jazyk.
Ad [2]: Díky za upřesnění. V době psaní článku byl bohužel server W3C.org spadlý, takže jsem si to nemohl ověřit.
[5] 7. 11. 2006, 10:22 – Honza Hučín (Odkaz)
Ad [3]: Samozřejmě je možné nepřevádět, k tomu je v HTMLTMPL atribut ESCAPE="NONE". Podstatné, že když se znaky převádějí, pak bez apostrofu.
[6] 7. 11. 2006, 10:33 – Honza Hučín (Odkaz)
A ještě ad [2]: Validátor XHTML Strict 1.0 vezme i apostrofy místo uvozovek, ověřeno.
[7] 7. 11. 2006, 11:17 – dgx (Odkaz)
A není prostě nejjednodušší opravit chybu v HTMLTMPL a opravu poslat i autorovi? Obecně není důvod, proč vše neescapovat vždy s ENT_QUOTES.
[8] 7. 11. 2006, 11:46 – Honza Hučín (Odkaz)
Ad [7]: Řešení to určitě je. Otázkou zůstává, zda nejjednodušší - v daném kontextu se zdá být nejjednodušší psát atributy s uvozovkami místo apostrofů (:
Ale asi udělám obojí. Možná půjde snadno napsat odvozenou třídu (s předělanou metodou pro escapování apostrofů).
[10] 7. 11. 2006, 13:45 – Honza Hučín (Odkaz)
Ad [9]: Taková zbytečnost, ale tak jo, ať máte radost...:D
[11] 7. 11. 2006, 18:01 – MzK (Odkaz)
V čem je problém v zabezpečení? Jak se toho dá zneužít? Uvozovky se ani nemusí používat, třeba klasické a href=index.html tareget=top...
[12] 14. 11. 2006, 23:49 – Jakub Vrána (Odkaz)
[2] Já tam tedy vidím '"' [^<&"]* '"' | "'" [^<&']* "'", což znamená, že jsou platné uvozovky i apostrofy.
[13] 15. 11. 2006, 08:21 – Věroš Kaplan (Odkaz)
[12] Děkuji za opravu. Aneb jak se ztrapnit snadno a rychle ve 2 lehkých krocích...
1) najít referenci
2) nepřečíst si ji pořádně
[14] 31. 3. 2011, 21:56 – fanky (Odkaz)
díky! solved my case
K tomuto článku není možné vkládat komentáře.
© Honza Hučín 2004–6
Šuplík běží na PIPNI.CZ. Díky!
8. 8. 16:48 | Pepa
7. 8. 21:26 | Honza Hučín
7. 8. 21:02 | Honza
6. 8. 14:29 | Pepa
3. 8. 18:29 | Honza
*1967, absolvent MFF UK v Praze (1991)
statistik, analytik, programátor, učitel, hudebník