Celem tego artykułu jest przegląd technik które można zastosować w tym celu, oraz możliwych zagrożeń które się z nimi wiążą.
Czysty tekst, bez formatowania
Ten sposób jest najłatwiejszy, i jednocześnie najbezpieczniejszy. W tekście otrzymanym z formularza należy zamienić wszystkie znaki specjalne na ich odpowiedniki w postaci encji HTML (dotyczy to znaków <, >, ", ' i &). W PHP można to łatwo zrobić za pomocą funkcji htmlspecialchars(). Dodatkowo warto zamienić wszystkie znaki nowej linii na <br>. Można to zrobić w PHP korzystając z funkcji nl2br() (uwaga: ta funkcja wstawia przed każdym znakiem nowej linii znacznik w stylu XHTML: <br />. Jeżeli potrzebujesz użyć <br>, skorzystaj z funkcji str_replace()).
BB Code
BB Code (skrót od Bulletin Board Code) jest to system znaczników wzorowany na HTML. Podstawową różnicą jest to iż znaczniki BB Code ograniczone są kwadratowymi nawiasami , a nie tak jak znaczniki HTML nawiasami trójkątnymi < >. Przykładowe znaczniki BB Code wyglądają następująco:
tekst - pogrubienie tekstu;
tekst - pochylenie tekstu;
color=redtekst/color - zmiana koloru tekstu;
http://www.poradnik-webmastera.com/ - wstawienie odnośnika;
- wstawienie obrazka.
Dzięki temu że te znaczniki są różne od znaczników HTML, można łatwo pozbyć się problemów które stwarza pozwolenie na używanie znaczników HTML - wystarczy najpierw zakodować specjalne znaki jako encje HTML stosując metodę podaną powyżej, a następnie zamienić znaczniki BB Code na odpowiadające im znaczniki HTML. Ponieważ tutaj należy zachować ostrożność podczas konwersji adresów URL (możliwość ataków XSS - Cross Site Scripting), warto skorzystać z gotowych i sprawdzonych bibliotek, takich jak np. biblioteka HTML_BBCodeParser z pakietu PEAR (http://pear.php.net/package/HTML_BBCodeParser).
Tekst ze znacznikami HTML
Wybór tego sposobu formatowania tekstu wiąże się z dwoma poważnymi problemami: po pierwsze, język HTML jest znany tylko niektórym osobom które na co dzień surfują po Internecie. Po drugie, udostępnienie możliwości używania znaczników HTML stwarza ogromne pole manewru dla każdego kto posiada złe zamiary - wstawienie kilku znaczników </table> i </div> może całkowicie "rozwalić" układ strony. Oprócz tego każdy może wstawić swój kawałek kodu w JavaScript, który może np. wyświetlać reklamy w okienkach pop-up, lub wykradać dane osobowe czy loginy i hasła. Dlatego stosując tą metodę należy zadbać o to aby wyczyścić kod HTML z wszystkich niepożądanych znaczników. Można to zrobić np. za pomocą funkcji PHP strip_tags().
To jest jednak początek - trzeba jeszcze usunąć niebezpieczne atrybuty znaczników (lub jeżeli to jest niemożliwe, przynajmniej sprawdzić że zawierają "bezpieczne" wartości). Do podejrzanych atrybutów tych należą m.in. href, src, style, onload, onclick i onmousemove. Dodatkowym zagrożeniem są znaczniki i atrybuty które mogą się pojawić w przyszłości, lub które istnieją już obecnie ale nie są powszechnie znane (np. SMIL (Synchronized Multimedia Integration Language, http://www.w3.org/AudioVideo/), które akceptuje Internet Explorer). Dlatego tutaj polecam też podejście takie jak przy znacznikach - zdefiniować listę znaczników które są dopuszczalne, i usuwać wszystkie inne. Warto także sprawdzać czy wartości przypisywane do atrybutów są poprawne (np. tylko cyfry, albo tylko litery, albo lista poprawnych wartości). W przypadku gdy potrzebujemy użyć atrybutu w którym można wstawić URL (jak np. href czy src, należy dokładnie sprawdzić czy wstawiony URL jest poprawnym adresem http lub https, gdyż tutaj pomysłowość ludzka nie zna granic (zresztą zobacz tutaj na listę różnych ataków XSS: http://ha.ckers.org/xss.html).
Uwagę należy poświęcić także kaskadowym arkuszom stylów CSS, gdyż one również mogą nieść zagrożenie (na podanej wcześniej stronie jest kilka przykładów). Dlatego warto rozważyć rezygnację z nich, co wiąże się z filtrowaniem stylów importowanych z zewnętrznego pliku, umieszczonych wewnątrz znacznika <style> oraz wewnątrz atrybutu style.
Graficzne edytory tekstu pisane w JavaScript
Obecnie coraz większą popularność zdobywają edytory tekstu napisane z użyciem JavaScript i umieszczane na stronach WWW. Jednym z nich jest OpenSource'owy FCKeditor. Mają one tą zaletę iż ich interfejs przypomina ten do którego przyzwyczaiły nas już różne okienkowe edytory tekstu, zatem początkujący użytkownik nie powinien mieć problemu z ich obsługą. Z drugiej zaś strony generują one tekst ze znacznikami HTML, więc konieczne jest tutaj pamiętanie o wszystkim tym co napisałem powyżej. Tutaj też musisz pamiętać że nawet jeżeli edytor którego używasz nie pozwala na edycję źródła HTML, to jednak możliwe jest napisanie programiku który będzie udawał przeglądarkę i wyśle do serwera tekst z dowolnie wstawionymi znacznikami HTML. Niekiedy nawet nie trzeba aż tyle wysiłku - proste wyłączenie JavaScript w przeglądarce może sprawić że wypasiony edytor zamieni się w zwykłe pole <textarea>, w które można sobie wpisać co się tylko zechce i wysłać do serwera.