Wuwejův zápisník

Proč v komentářích nefungují speciální znaky a jiné abecedy

26.12.2009 09:50, Wu | počítače | o blogu | komentáře -

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: &#x0C0B; 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í &#x0C0B;.

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 &#x0C0B; („zobraz znak 0C0B“, „přines jablko“) tohle &amp;#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.)

12345
1261817400000

Kategorie

Informace

Kontakt

Sledujte také

Archiv

STRÁNKY ARCHIVOVÁNY NÁRODNÍ KNIHOVNOU ČR

CBDB.cz – Databáze knih a spisovatelů, knihy online