Existují dvě velmi důležité věci, které musíte udělat, abyste se vyhnuli vážným bezpečnostním problémům.
-
Před vložením uživatelského vstupu do dotazu SQL musíte uniknout. Escapování znamená escapování všech speciálních znaků, jako je
'
; naštěstí existuje funkce, která to již dělá automaticky:mysql_real_escape_string .Pokud neuniknete uživatelskému vstupu, mohou se stát ošklivé věci. Představte si, že váš dotaz je
INSERT INTO userdata VALUES ('$user_data')
. Nyní si představte, že uživatel napsal'; DROP DATABASE userdata;
.Pokud jej neuzavřete, váš dotaz bude vypadat takto:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Jak si dokážete představit, není to dobré:pokud máte povoleno více příkazů, můžete se rozloučit se svou databází. Toto se nazývá vložení SQL útok. -
Když odesíláte proměnnou uživateli, musíte také správně nahradit speciální znaky HTML entitami HTML. Naštěstí existuje funkce, která to dokáže:htmlspecialchars() . Transformuje speciální HTML znaky, jako je
<
na<
.Zdá se, že jde o problém, který je často podceňován, ale ve skutečnosti je velmi vážný. Představte si, že
$user_data
obsahuje<script>SomeNastyScript()</script>
. Mohl by zneužít existující zranitelnosti v prohlížeči vašich uživatelů nebo by mohl poslat útočníkovi soubor cookie, který není HTTPOnly (který může obsahovat uložená hesla), nebo by mohl uživatele oklamat, aby zapsal své heslo do formuláře vygenerovaného manipulací s DOM (možné v javascriptu) nebo mnoho dalších špatných věcí.Toto se nazývá XSS (Skriptování napříč weby).
Krátká verze
-
Zavolejte
mysql_real_escape_string
na řetězec před vložením do vašeho SQL dotazu (ale ne kdyžecho
to). -
Zavolejte
htmlspecialchars
na řetězec, než jej zobrazíte uživateli (ale ne, když jej vložíte do databáze).