Nejdřív pro připomenutí jak fungují webové stránky. Máte prohlížeč, do něj zadáte internetovou adresu. Prohlížeč se spojí se serverem na dané adrese, vyžádá si kód stránky a server mu ji pošle. Kód je obvykle v jazyku HTML nebo XHTML a vypadá nějak takto (fragment):
<body>
<div id="xmain">
<div id="xheader">
<a href="../../../index.html" title="Wuwejův zápisník - titulní stránka"><span>Wuwejův zápisník</span></a>
</div>
<div id="xposts">
<div class="xpost">
<h3>Je opravdu Švejk zosobněním typického Čecha?</h3>
<div class="about"><b>14.11.2009</b> 23:25, <b>Wu</b> |
<a href="../../../categ-sociologie.html">sociologie</a> |
Komentáře se ukládají do databáze a stránka se z nich sestavuje dynamicky. Cokoliv do něj napíšete, to se stane součástí stránky - jenže vy nemusíte psát jenom text, můžete vepsat i příkazy ze zdrojového kódu HTML, třeba <script>...</script>, kterým se vkládá javascript, kousek programu pro práci s obsahem prohlížeče (s ničím jiným za normálních okolností zacházet nemůže, na to jsou bezpečnostní pravidla). Pouhá návštěva kohokoliv na stránce s komentáři by ho pak spustila.
Na první pohled to nevypadá nijak nebezpečně, ale takhle spuštěný kód může provádět leccos. Především se stal součástí stránky a může ji libovolně měnit, nahrazovat text, nadpis apod. U blogu se to snese, u aplikace zobrazující kurzovní lísek už by to mohlo mít dopad na finance (kdybyste se na základě takových informací rozhodli nějaké pro nějaké finanční operace). Také má přístup ke cookies a pokud jste na webu přihlášení, může vaše přihlášení přenést k někomu jinému. Případně by skrytě mohl iniciovat komunikaci na jiný server, třeba na seznam.cz, a pokud tam používáte trvalé přihlášení (což je velmi pravděpodobné), mohl by začít manipulovat s vaší poštou... tomuhle se říká cross-site scripting a je to skutečně reálné riziko.
Takže já než komentář uložím, pustím na něj funkci, která klíčové znaky < > " a &, používané v příkazech HTML, převede na jejich opis, entitu - browser pak ví, že znak < nemá interpretovat jako začátek příkazu, ale má ho pouze zobrazit. Proto nemůžete vkládat formátovaný text, žádné tučné písmo, kurzívu apod.
A teď abecedy - většinou se odesílají jako html nebo unicode entity. Tj. zakódované pomocí znaků ampersand, hash, písmene x, hexadecimálním číslem znaku a středníkem. Takhle: ఋ Když tohle je ve zdrojovém kódu stránky, prohlížeč ví, že je to příkaz pro zobrazení Unicode znaku číslo 0C0B: ఋ (pokud dané písmo má v systému). Ale výše zmíněné bezpečnostní převedení mi ze znaku & udělalo entitu, opis, a tudíž ho vyřadilo z provozu. Už neoznačuje začátek příkazu, stal se z něj pouze zobrazení znaku & - takže místo znaku ఋ se zobrazí ఋ.
Je to jako kdybyste místo jablka postavili na stůl jeho obrázek. Zátiší bude vypadat stejně, ale už si moc nepochutnáte. Ve zdrojovém kódu stránky je místo ఋ („zobraz znak 0C0B“, „přines jablko“) tohle &#x0C0B; („zobraz znak ampersand a vykresli znaky #x0C0B;“, „nakresli jablko“).
A to je ve stručnosti důvod, proč tady nefungují speciální znaky a abecedy. Nejspíš ani nikdy nebudou, protože předělávat to do nějakého složitějšího systému filtrace se mi nezdá jako dobře vynaložená námaha.
(Článek vznikl upravením a rozšířením komentáře, v němž jsem Henrymu Psancovi objasňoval, proč mu tady systematicky ničím komentářové citace v azbuce.)
Hodnocení hvězdičkami používá jako prevenci
opakovaného kliknutí anonymní cookie.
Pokud s tím nesouhlasíte, neklikejte.
Další podrobnosti k cookies zde.