Wszystkie artykuły

HTML Entities: jak bezpiecznie wyświetlać znaki specjalne

W HTML znaki <, > i & mają specjalne znaczenie i trzeba je escapować, ale polski alfabet dokłada do tego dziewięć własnych liter diakrytycznych oraz odrębną konwencję cudzysłowów, o której większość ogólnych poradników w ogóle nie wspomina.

Dziewięć polskich znaków diakrytycznych

Litery ą, ć, ę, ł, ń, ó, ś, ź i ż nie mają odpowiedników w podstawowym ASCII. Przy UTF-8 nie trzeba ich już zamieniać na encje, żeby się poprawnie wyświetliły, ale wciąż pojawiają się w postaci encji numerycznych w starszych eksportach CSV, plikach z czasów kodowania ISO-8859-2 (Latin-2) czy w nagłówkach e-maili generowanych przez starsze systemy transakcyjne.

Polskie cudzysłowy „dolne-górne", jak w niemieckim

Polska typografia otwiera cudzysłów znakiem dolnym &bdquo;, a zamyka górnym &rdquo; — „tak jak tutaj" — a nie prostymi cudzysłowami " w stylu angielskim. Motyw wizualny (szablon bloga, CMS) przeniesiony bez zmian z anglojęzycznego oryginału bardzo często pokazuje niewłaściwy typ cudzysłowu, bo znaki są zaszyte na sztywno w kodzie szablonu.

Minimalny zestaw znaków do escapowania

  • <&lt; — żeby nie zaczynał się tag.
  • >&gt; — żeby poprawnie zamknąć tekst po tagu.
  • &&amp; — żeby & nie był odczytany jako początek innej encji.
  • " i '&quot;, &#39; — wymagane wewnątrz atrybutów w cudzysłowach.

Związek z XSS

Większość podatności XSS powstaje właśnie dlatego, że tekst wprowadzony przez użytkownika jest wstawiany do HTML bez escapowania. Wyświetlenie „<script>...</script>" bez zamiany na encje sprawi, że przeglądarka wykona go jako kod. Escapowanie to podstawowa — choć nie jedyna — ochrona przy wyświetlaniu dynamicznej treści.

Kontekst ma znaczenie: tekst kontra atrybut

Escapowanie <, > i & wystarcza dla tekstu między znacznikami, ale wewnątrz atrybutu w cudzysłowie trzeba dodatkowo escapować dokładnie ten znak cudzysłowu, który został użyty — podwójny lub pojedynczy. Jeśli atrybut jest ograniczony cudzysłowem podwójnym, a w wartości znajduje się nieescapowany cudzysłów podwójny, znacznik „urwie się" wcześniej niż oczekiwano.

Wypróbuj narzędzie