Ik heb een website gemaakt die werkt met een mysql database,ik probeer die nu te beveiligen tegen sql injection.
Ik zal gebruik maken van strip_tags().
Ik probeer nu bij wijze van test zelf php-code in te brengen in mijn database via een onbeveiligd formulier;
Mijn code:
<html>
<form method="POST" action="besdel.php">
geef de naam in die u wenst te wijzigen <input type="text" name="naam">
<input type="submit" name="submit" value="verzenden">
</form>
<?php
include("config.php");
$naam=$_POST['naam'];
mysql_query("DELETE FROM wachtwoord WHERE naam ='$naam'");
?>
</html>
Maar wanneer ik in het formulier invul (zonder dubbele quotes) “karel'OR'1'='1” is er toch niets uit mijn tabel verwijderd.
Wat doe ik verkeerd?
Alvast bedankt.
INSERT -> mysql_real_escape_string() gebruiken.
Dit beschermt je tegen sql injection.
Hou verder de gegevens zo puur mogelijk.
Post data (gegevens, gestuurd door de gebruiker) eerst door htmlentities() of strip_tags() (of wat dan ook) en dan inserten, is niet de bedoeling.
SELECT -> strip_tags() / eventueel iets als htmlentities()
Wat kan nog fout lopen?
De gebruiker kan actieve html gepost hebben.
Stel: de gebruiker post '</div></div></div></div></table></table></table></table>'
De kans is vrij groot dat de volledige lay out van je site naar de ****** is.
En dit is nog maar één van de meer onschuldige problemen. Het kan erger.
Twee mogelijkheden:
- strip_tags(): Dit verwijdert alle html elementen. Alles wat binnen html tags staat, komt dan als gewone tekst. De tags op zich worden gewoon niet getoond.
- htmlentities() of htmlspecialchars(): Dit vormt html tags om in tekst die er uit ziet als de tekst, maar die absoluut geen werking hebben.
Hier kan je een voorbeeld zien van de tweede oplossing.
<a href="mijnlink.com">Link die niet werkt</a>
Bij elk VARCHAR / TEXT veld moet je de gegevens dus door één van die functies sturen; dus ook velden zoals titel, nicknaam, signature, ... .
Een INT / DATE / ... veld is al sowieso beschermd; daar hoeft dit niet.