Oczyszczanie danych HTML na wej┼Ťciu i wyj┼Ťciu

> Dodaj do ulubionych

Do prostego oczyszczania danych HTML mo┼╝na u┼╝ywa─ç funkcji htmlentities(). Je┼Ťli natomiast potrzebne jest bardziej zaawansowane rozwi─ůzanie, lepszym rozwi─ůzaniem jest skorzystanie z biblioteki HTML Purifier.

Rozwi─ůzanie przetestowano przy u┼╝yciu biblioteki HTML Purifier 4.6.0.

Je┼Ťli aplikacja wy┼Ťwietla na stronie dane wprowadzone do niej przez u┼╝ytkownika, to musi je najpierw ÔÇ×oczy┼Ťci─çÔÇŁ, aby pozby─ç si─Ö potencjalnie gro┼║nego kodu HTML. Nie┼╝yczliwy nam u┼╝ytkownik mo┼╝e tak spreparowa─ç znaczniki HTML, aby u┼╝yte na stronie stanowi┼éy zagro┼╝enie dla jej u┼╝ytkownika.

Nawet je┼Ťli poczujesz pokus─Ö, aby do oczyszczania danych HTML wykorzysta─ç wyra┼╝enia regularne, koniecznie si─Ö jej oprzyj. HTML to skomplikowany j─Özyk i mo┼╝esz mie─ç pewno┼Ť─ç, ┼╝e ka┼╝da samodzielna pr├│ba oczyszczania danych w tym formacie zako┼äczy si─Ö pora┼╝k─ů.

Niekt├│rzy radz─ů te┼╝ u┼╝ywa─ç funkcji strip_tags(). Pod wzgl─Ödem technicznym jest ona ca┼ékiem bezpieczna, ale jest to te┼╝ bardzo ÔÇ×durnaÔÇŁ funkcja, tzn. je┼Ťli zostanie do niej przekazany nieprawid┼éowy kod HTML (np. z brakiem znacznika zamykaj─ůcego), to mo┼╝e usun─ů─ç o wiele wi─Öcej ni┼╝ by┼Ťmy chcieli. Zatem wyb├│r funkcji strip_tags() nie jest najlepszy, poniewa┼╝ u┼╝ytkownicy nie maj─ůcy wiedzy technicznej cz─Östo u┼╝ywaj─ů znak├│w < i > w swoich pisemnych wypowiedziach.

Je┼Ťli kto┼Ť przeczyta┼é artyku┼é o sprawdzaniu poprawno┼Ťci adres├│w e-mail w PHP, to mo┼╝e rozwa┼╝a─ç te┼╝ mo┼╝liwo┼Ť─ç u┼╝ycia funkcji filter_var(). Niestety funkcja filter_var() ma problemy ze z┼éamaniami wiersza i wymaga trudnej konfiguracji, je┼Ťli ma dzia┼éa─ç podobnie do funkcji htmlentities(). Dlatego jej wyb├│r te┼╝ nie jest najlepszym pomys┼éem.

Oczyszczanie danych w prostych przypadkach

Je┼╝eli aplikacja internetowa ma za zadanie tylko zast─ůpi─ç wszystkie elementy sk┼éadni HTML encjami (i w ten spos├│b je unieszkodliwi─ç, ale pozostawi─ç je w kodzie), nale┼╝y pos┼éu┼╝y─ç si─Ö funkcj─ů wbudowan─ů htmlentities(). Funkcja ta jest znacznie szybsza od biblioteki HTML Purifier, poniewa┼╝ nie sprawdza poprawno┼Ťci kodu HTML, a jedynie go unieszkodliwia.

Funkcja htmlentities() r├│┼╝ni si─Ö od swojej kuzynki htmlspecialchars() tym, ┼╝e stosuje kompleksowo encje HTML, a nie tylko ich niewielki podzbi├│r.

Przykład

<?php
// O nie!  Użytkownik wysłał w formularzu szkodliwy kod HTML, a my musimy go przedstawić na stronie internetowej!
$evilHtml = '<div onclick="xss();">Mua-ha-ha! Podkr─Öcam m├│j z┼éowieszczy w─ůs...</div>';
 
// Dodajemy znacznik ENT_QUOTES, aby zamieniać na encje zarówno pojedyncze jak i podwójne cudzysłowy.
// Stosujemy kodowanie znak├│w UTF-8, je┼Ťli zapisali┼Ťmy tekst w tym formacie  (tak jak powinni┼Ťmy).
// Wi─Öcej informacji na ten temat znajduje si─Ö w artykule o UTF-8 i PHP.
$safeHtml = htmlentities($evilHtml, ENT_QUOTES, 'UTF-8'); // Teraz zmienna $safeHtml zawiera unieszkodliwiony kod HTML. Jej zawarto┼Ť─ç mo┼╝na bez obaw przedstawi─ç u┼╝ytkownikom!
?>

Oczyszczanie danych w złożonych przypadkach

W wielu aplikacjach internetowych takie proste rozwi─ůzanie, jak przedstawione powy┼╝ej jest niewystarczaj─ůce. Cz─Östo programista chce usun─ů─ç ca┼éy kod HTML albo przepu┼Ťci─ç tylko niewielki zestaw element├│w tego j─Özyka. Do takich cel├│w doskonale nadaje si─Ö biblioteka HTML Purifier.

HTML Purifier to gruntownie przetestowana, ale powolna biblioteka, wi─Öc je┼Ťli nie ma si─Ö zbyt wyg├│rowanych wymaga┼ä, lepiej zamiast niej u┼╝ywa─ç funkcji htmlentities().

Zalet─ů biblioteki HTML Purifier w por├│wnaniu z funkcj─ů strip_tags() jest to, ┼╝e sprawdza poprawno┼Ť─ç kodu przed jego unieszkodliwieniem. Dzi─Öki temu, je┼Ťli u┼╝ytkownik wpisze nieprawid┼éowy kod HTML, biblioteka HTML Purifier daje wi─Öksz─ů szans─Ö na zachowanie jego znaczenia ni┼╝ funkcja strip_tags(). Poza tym biblioteka ta ma wiele opcji konfiguracyjnych, za pomoc─ů kt├│rych mo┼╝na wskaza─ç, kt├│re elementy HTML maj─ů by─ç przepuszczane przez filtr.

Wadami biblioteki HTML Purifier s─ů jej powolno┼Ť─ç, konieczno┼Ť─ç dokonania pewnych ustawie┼ä konfiguracyjnych, co mo┼╝e by─ç niemo┼╝liwe w hostingach wsp├│┼édzielonych oraz skomplikowana i niejasna dokumentacja. Poni┼╝ej znajduje si─Ö przyk┼éad podstawowej konfiguracji. Je┼Ťli chcesz pozna─ç bardziej zaawansowane funkcje tej biblioteki, zajrzyj do jej dokumentacji.

Przykład

<?php
// do┼é─ůczenie do skryptu biblioteki HTML Purifier
require_once('htmlpurifier-4.6.0/HTMLPurifier.auto.php');
 
// O nie!  Użytkownik wysłał w formularzu szkodliwy kod HTML, a my musimy go przedstawić na stronie internetowej!
$evilHtml = '<div onclick="xss();">Mua-ha-ha! Podkr─Öcam m├│j z┼éowieszczy w─ůs...</div>';
 
// Utworzenie obiektu HTML Purifier o domy┼Ťlnych ustawieniach.
$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
 
$safeHtml = $purifier->purify($evilHtml); // Teraz zmienna $safeHtml zawiera unieszkodliwiony kod HTML. Jej zawarto┼Ť─ç mo┼╝na bez obaw przedstawi─ç u┼╝ytkownikom!
?>

Pułapki

  • Je┼Ťli funkcja htmlentities() zostanie u┼╝yta z niew┼éa┼Ťciwym kodowaniem znak├│w, mo┼╝na otrzyma─ç zaskakuj─ůce wyniki. Dlatego wywo┼éuj─ůc t─Ö funkcj─Ö zawsze okre┼Ťlaj kodowanie znak├│w, kt├│re powinno zgadza─ç si─Ö z kodowaniem oczyszczanego ┼éa┼äcucha. Wi─Öcej szczeg├│┼é├│w na ten temat znajduje si─Ö w artykule o UTF-8 i PHP.
  • W wywo┼éaniu funkcji htmlentities() zawsze podawaj parametry ENT_QUOTES i kodowania znak├│w. Domy┼Ťlnie funkcja ta nie koduje pojedynczych cudzys┼éow├│w. Co za g┼éupota!
  • Biblioteka HTML Purifier bardzo powoli przetwarza skomplikowane dokumenty HTML. Dlatego zwr├│cone przez ni─ů wyniki oczyszczania dobrze jest zapisywa─ç w buforze, np. APC.

Autor: Alex Cabal

Źródło: http://phpbestpractices.org/

Tłumaczenie: Łukasz Piwko

Tre┼Ť─ç tej strony jest dost─Öpna na zasadach licencji CC BY-SA 3.0