sql-injection
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>
<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.
Bouw eens een goede fout afhandeling in. Je kunt nu toch niet zien wat er fout gaat of wel?
Gewijzigd op 06/01/2011 11:19:18 door - Mark -
Code (php)
1
2
3
2
3
<?php
mysql_query("DELETE FROM wachtwoord WHERE naam ='".mysql_real_escape_string($_POST['naam'])."'");
?>
mysql_query("DELETE FROM wachtwoord WHERE naam ='".mysql_real_escape_string($_POST['naam'])."'");
?>
Gewijzigd op 06/01/2011 12:17:25 door gerhard l
Vraag:
Is het voldoende beveiligd als ik real escape string toepas zoals voorbeeld van G.L.?
Wel voor toepassing in de database, niet voor weergave in html.
Scrippy do op 06/01/2011 13:46:41:
Ben hier toevallig ook mee bezig.
Vraag:
Is het voldoende beveiligd als ik real escape string toepas zoals voorbeeld van G.L.?
Vraag:
Is het voldoende beveiligd als ik real escape string toepas zoals voorbeeld van G.L.?
ligt eraan.
ook zou ik htmlentities gebruiken.
maar voor de database is real_escape_string genoeg
Gewijzigd op 06/01/2011 13:49:50 door Dindong Veter
Paul L op 06/01/2011 13:49:16:
ook zou ik htmlentities gebruiken.
HTMLentities is toch voor het eruit halen van data?
Als het goed is pakt html(entities, specialchars) standaard ISO-8859-1. Ik gebruik altijd het volgende.
Of
@Wouter
Volgens mij bedoel jij strip_tags ?
Gewijzigd op 06/01/2011 14:59:20 door Niels K
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.
Gewijzigd op 07/01/2011 10:01:38 door Kris Peeters