2009-02-27 12 views
7

Użytkownik wprowadzi tekst w obszarze tekstowym. Jest on następnie wstawiany bezpośrednio do bazy danych mySQL. Używam trim, htmlentities, mysql_real_escape_string i mam włączone magiczne cytaty. Jak powinienem je odkażać, gdy dane te są ponownie przesyłane do obszaru tekstowego?Jak prawidłowo odkażać dane otrzymane z obszaru tekstowego, po wyprowadzeniu go z powrotem do obszaru tekstowego?

Dzięki za pomoc. Nigdy nie byłem zbyt pewny, jak to zrobić ...

+0

Polecam wyłączenie ofert magicznych, spowoduje to problemy tylko później. –

Odpowiedz

14

Podczas zapisywania nie powinieneś używać htmlentities. Powinieneś używać htmlentities podczas wyświetlania. Zasadą jest, że nie należy kodować/dezynfekować danych, dopóki nie zajdzie taka potrzeba. Jeśli podczas zapisywania robisz htmlentities, musisz zrobić html_entity_decode na tekście, gdy użytkownik chce edytować dane wejściowe. Więc oczyszczasz to, czego potrzebujesz i nic więcej. Podczas zapisywania tego, musisz odkażać do iniekcji SQL, więc to jest mysql_real_escape_string. Podczas wyświetlania należy zdezynfekować XSS, aby można go było odczytywać w następujący sposób: htmlentities.

Ponadto, nie jestem pewien, czy widzisz komentarz Darryl Hein, ale naprawdę nie chcesz włączyć magic_quotes. They are a bad, bad, thing i są przestarzałe od PHP 5.3 i znikną całkowicie w PHP 6.

+0

Czy to powinien być jedyny środek ostrożności? –

+0

Jeśli nie masz nic przeciwko temu, aby HTML był w dowolnym ciągu, to wszystko. Jeśli chcesz, aby HTML był dozwolony, to idziesz bardzo niebezpieczną drogą białych list i cokolwiek innego. –

+0

Po prostu na marginesie, czy to prawda, gdy analizowane są również BBCode? –

2

Oprócz odpowiedzi Paola na temat, kiedy używać htmlentities(), chyba że używasz starej wersji PHP, prawidłowy sposób na dezynfekcję dla wstawienie do mysql DB jest użycie Prepared Statements, które są częścią mysqli extension. Zastępuje to każdą potrzebę użycia mysql_real_escape_string().

Poza tym, myślę, że masz rzeczy pokryte.

+1

Zwróć uwagę, że użycie przygotowanych instrukcji nie wystarczy, musisz użyć parametrów związanych. IOW: użyj "?" w łańcuchu SQL i wysłać dane za pomocą stmt-> bind_param() – Javier

+0

W normalnych przepływach pracy, czy nie chciałbyś uchwycić nieprawidłowego tekstu przed osiągnięciem instrukcji przygotowania? W takim przypadku, czy nie nadaje się do użycia mysql_real_escape_string – AlxVallejo

Powiązane problemy