Są dwie bardzo ważne rzeczy, które musisz zrobić, aby uniknąć poważnych problemów z bezpieczeństwem.
-
Przed umieszczeniem ich w zapytaniu SQL należy zmienić znaczenie danych wprowadzonych przez użytkownika. Ucieczka oznacza uniknięcie wszystkich znaków specjalnych, takich jak
'
; na szczęście istnieje funkcja, która robi to automatycznie:mysql_real_escape_string .Jeśli nie uciekniesz od wprowadzania danych przez użytkownika, mogą się zdarzyć nieprzyjemne rzeczy. Wyobraź sobie, że Twoje zapytanie to
INSERT INTO userdata VALUES ('$user_data')
. Teraz wyobraź sobie, że użytkownik napisał'; DROP DATABASE userdata;
.Jeśli go nie zmienisz, Twoje zapytanie zmieni się w:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Jak możesz sobie wyobrazić, to nie jest dobre:jeśli masz włączoną obsługę wielu instrukcji, możesz pożegnać się ze swoją bazą danych. Nazywa się to wstrzyknięciem SQL atak. -
Kiedy wysyłasz swoją zmienną do użytkownika, musisz również odpowiednio zastąpić znaki specjalne HTML encjami HTML. Na szczęście istnieje również funkcja, która to robi:htmlspecialchars() . Przekształci specjalne znaki HTML, takie jak
<
do<
.Wydaje się, że jest to często niedoceniany problem, ale w rzeczywistości jest bardzo poważny. Wyobraź sobie, że
$user_data
zawiera<script>SomeNastyScript()</script>
. Może wykorzystać istniejące luki w zabezpieczeniach przeglądarki użytkowników lub wysłać atakującemu plik cookie inny niż HTTPOnly (który może zawierać zapisane hasła) lub nakłonić użytkownika do zapisania hasła w formularzu wygenerowanym przez manipulację DOM (możliwe w javascript) lub wiele innych złych rzeczy.Nazywa się to XSS (Cross-site scripting).
Krótka wersja
-
Zadzwoń do
mysql_real_escape_string
na łańcuchu przed wstawieniem go do zapytania SQL (ale nie wtedy, gdyecho
) to). -
Zadzwoń do
htmlspecialchars
na łańcuchu przed wyświetleniem go użytkownikowi (ale nie po umieszczeniu go w bazie danych).