MySQL injection?
Vaak lees ik over bugs als "MySQL injection". Wat is dit nou precies en hoe ga je het tegen? En hoe beveilig je je database eigenlijk?
Gr. Roel
Edit:
Sorry voor het lastig vallen, had niet goed gezocht bij tutorials.
Sorry voor het lastig vallen, had niet goed gezocht bij tutorials.
Gewijzigd op 01/01/1970 01:00:00 door Roel
Klik
EDIT: Hier op PHPHulp.nl staan ook nog wat tutorials over SQL injectie.
Niemand kan het beter uitleggen dan wikipedia: EDIT: Hier op PHPHulp.nl staan ook nog wat tutorials over SQL injectie.
Gewijzigd op 01/01/1970 01:00:00 door GaMer B
Tevens kun je dan eenvoudiger een andere database, bv. PostgreSQL of FireBird, gaan gebruiken.
Verder is het trouwens eigenlijk SQL-injection en niet MySQL-injection. Want je injecteert SQL-code en niet een heel database systeem.
Wat is PDO dan en hoe gebruik ik het dan? En waarom zou je er dan geen last meer van hebben?
Roel schreef op 01.07.2007 14:26:
Wat is PDO dan en hoe gebruik ik het dan? En waarom zou je er dan geen last meer van hebben?
Mr. G. Oogle zegt: Klikk0rz
Hier lees je meet over PDO::prepare.
PDO is de geen vrijwaring van SQL injection omdat je er bij PDO::query nog net zo goed last van kan hebben.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
include("includes/connect.php");
if($_POST['submit']) {
mysql_query("INSERT INTO `[test]` (naam, pass) VALUES ('" . $_POST['naam'] . "', '" . $_POST['pass'] . "')");
}
else {
PRINT <<<FORM
<html>
<head>
<title>TEST</title>
</head>
<body>
<form action="test.php" method="POST">
Naam: <input type="text" name="naam"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" name="submit" value="Test">
</form>
</body>
</html>
FORM;
}
?>
include("includes/connect.php");
if($_POST['submit']) {
mysql_query("INSERT INTO `[test]` (naam, pass) VALUES ('" . $_POST['naam'] . "', '" . $_POST['pass'] . "')");
}
else {
PRINT <<<FORM
<html>
<head>
<title>TEST</title>
</head>
<body>
<form action="test.php" method="POST">
Naam: <input type="text" name="naam"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" name="submit" value="Test">
</form>
</body>
</html>
FORM;
}
?>
connect.php maakt gewoon verbinding met me DB, dit script werkt ook gewoon alleen als ik dan probeer om hem te 'injecten' lukt hiet niet. Ik doe precies zoals het in het voorbeeld staat. Namelijk bij Naam "Pietje Puk', 'passwoord1'), ('Sinterklaas" invullen en bij Password gewoon een woord. Als ik dit doe komt er geen injection, hij voert het gewoon letterlijk in mijn DB in terwijl ik niks beveiligt heb, hoe kan dat:S
Ook snap ik de oplossing die ze geven niet helemaal. Er staat strip_slashes maar er moeten toch juist slashes bij voor de quotes?
Wie snapt dit en kan helpen?
Gooi deze zooi dus weg, ga je zitten schamen, gebruik ze nooit meer en vergeet dat je ze ooit hebt gebruikt.
Verder vergeet je de functie mysql_real_escape_string() te gebruiken en heb je waarschijnlijk het geluk dat magic_quotes is aangezet. Van dat soort toevaligheden wil je echter niet afhankelijk zijn. Kortom, beveiligen die queries!
mysql_real_escape_string() ben ik niet vergeten, ik heb dit script expres onbeveiligt gemaakt om te TESTEN. Maar het raren is dus dat het al geveiligt blijkt te zijn:S Maar dat komt dus door magic_quotes? En hoe zou jij deze query beveiligen? Er staat zoveel mogelijkheden
mysql_query is ook al enigzins beveiligd. Voor zover ik weet doet die namelijk maar een query uitvoeren. Natuurlijk wel gevaarlijk als dat net een drop, delete of truncate actie is, maar dat zou je ook met rechten kunnen beveiligen / afschermen.
Alvast bedankt,
* addslashes() - Deze voegt slashes toen, maar is niet bedoeld om SQL injection tegen te gaan.
* htmlspecialchars() - Dit doet iets heel anders (kan je namelijk gebruiken tegen xss), heeft niks met sql injection te maken, het zet tekens als < om naar hun html code en kan eventueel door ENT_QUOTES als 2e parameter mee te geven ook quotes om zetten, maar ook dit is niet bedoeld om SQL injection tegen te gaan. Met name omdat je htmlpecialchars() altijd pas moet uitvoeren als je data uit de database haalt(!) omdat je deze dan eventueel ook nog voor andere dan HTML doeleinden kan gebruiken (denk aan e-mail). Ook is htmlspecialchars niet volledig, htmlentities() is completer.
* mysql_real_escape_string() - Als je de gewone mysql_* functies gebruikt is dit dé manier om sql injection te voorkomen.
Hierbij moet ik wel vermelden dat als je PHP 5 tot je beschikking hebt het eenvoudiger is prepaired statements te gebruiken ...
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Stripslashes is het omgedraaide van addslashes() en zal dus de toegevogede \ weghalen zodat ze niet meer in de tekst verschijnen.
Htmlspecialchars() doet speciale html karakters omzetten in onschadelijke html karakters. Zo wordt bijvoorbeeld & omgezet in & waardoor er dus geen javascripts o.i.d. kunnen worden uitgevoerd.
Mysql_escape_string() is ongeveer hetzelfde als addslashes(), omdat deze functie ook de ' of " doen escapen (onschadelijk maken).
mysql_real_escape_string() is hetzelfde als mysql_escape_string(), maar iets ??uitgebreider??
Quote:
mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.
Ik hoop dat het een beetje duidelijk is. Een aantal functies overlappen elkaar soms een beetje.
Ja zeer duidelijk, maar welke gebruik jij bijvoorbeeld? is alleen addslashes genoeg?
mysql_real_escape_string(), omdat het gewoon goed werkt tegen Mysql injection
htmlspecialchars(), omdat het die html tags omzet naar onschadelijke html code, zodat er geen javascript (XSS) uitgevoerd kan worden.
EDIT: htmlspecialchras() dan wel bij de output van een query.
Gewijzigd op 01/01/1970 01:00:00 door GaMer B
GaMer13 schreef op 02.07.2007 16:46:
En vervolgens kom je hopeloos in de problemen wanneer je de gegevens voor iets anders dan html nodig hebt...htmlspecialchars(), omdat het die html tags omzet naar onschadelijke html code, zodat er geen javascript (XSS) uitgevoerd kan worden.
htmlspecialchars() gebruik je voor output en nooit en te nimmer op input van de database. Dus bij een echo is het leuk en aardig, maar bij een insert-query bezorg je jezelf vroeg of laat een berg overbodig werk.
Niet doen dus.
en strip_tags(), wanneer gebruik je die?
Rik schreef op 02.07.2007 18:01:
Meestal bij het opschonen van input. Dat hoef je dan slechts 1x te doen, daarna is de data veilig te gebruiken.en strip_tags(), wanneer gebruik je die?
pgFrank schreef op 02.07.2007 17:46:
Niet doen dus.
GaMer13 schreef op 02.07.2007 16:46:
htmlspecialchars() gebruik je voor output en nooit en te nimmer op input van de database. Dus bij een echo is het leuk en aardig, maar bij een insert-query bezorg je jezelf vroeg of laat een berg overbodig werk.htmlspecialchars(), omdat het die html tags omzet naar onschadelijke html code, zodat er geen javascript (XSS) uitgevoerd kan worden.
Niet doen dus.
Ja, daarbij doe ik dat ook. Bijvoorbeeld bij een self-made-blog of forum o.i.d. Ik zal het er even bij zetten...