Er zijn twee zeer belangrijke dingen die u moet doen om ernstige beveiligingsproblemen te voorkomen.
-
U moet aan de gebruikersinvoer ontsnappen voordat u deze in uw SQL-query plaatst. Ontsnappen betekent ontsnappen aan alle speciale tekens zoals
'
; gelukkig is er een functie die het al automatisch doet:mysql_real_escape_string .Als u niet ontsnapt aan gebruikersinvoer, kunnen er vervelende dingen gebeuren. Stel je voor dat je zoekopdracht
INSERT INTO userdata VALUES ('$user_data')
is . Stel je nu voor dat de gebruiker'; DROP DATABASE userdata;
.Als u er niet aan ontsnapt, wordt uw vraag:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Je kunt je voorstellen dat dit niet goed is:als je multi-statements hebt ingeschakeld, kun je afscheid nemen van je database. Dit heet een SQL-injectie aanval. -
Wanneer u uw variabele naar de gebruiker uitvoert, moet u ook de speciale HTML-tekens op de juiste manier vervangen door HTML-entiteiten. Gelukkig is er ook een functie om dat te doen:htmlspecialchars() . Het transformeert de speciale HTML-tekens zoals
<
naar<
.Dit lijkt een probleem dat vaak wordt onderschat, maar in werkelijkheid is het zeer ernstig. Stel je voor dat
$user_data
bevat<script>SomeNastyScript()</script>
. Het zou bestaande kwetsbaarheden in de browser van uw gebruikers kunnen misbruiken, of het zou een niet-HTTPOnly-cookie (die opgeslagen wachtwoorden kan bevatten) naar de aanvaller kunnen sturen, of het zou de gebruiker kunnen misleiden om zijn wachtwoord te schrijven op een formulier dat is gegenereerd door de manipulatie van de DOM (mogelijk in javascript), of een heleboel andere slechte dingen.Dit heet XSS (Cross-site scripting).
Korte versie
-
Bel
mysql_real_escape_string
op de tekenreeks voordat u deze in uw SQL-query invoegt (maar niet wanneer uecho
het). -
Bel
htmlspecialchars
op de string voordat u deze aan de gebruiker toont (maar niet wanneer u deze in de database plaatst).