Doe ik anti SQLinjection zo op de juiste manier?
Het valt niet mee om een duidelijke, Nederlandse uitleg te vinden over anti SQLinjection. Eigenlijk snap ik nu pas dat een kwaadwillend iemand code in mijn url of zoekformulier kan invoegen zodat er bv. een hele tabel uit mijn database verwijderd kan worden. De hoogste tijd dus om er iets aan te doen.....
Maar daar heb ik stap voor stap wel jullie hulp bij nodig. En wel mensen die veel geduld hebben :)
Eerst laat ik een stuk code zien op de oude manier:
En nu de aangepaste versie:
Ben ik zo op de juiste weg?
Ik ben trouwens dit bestand aan het doornemen: http://h1.ripway.com/rakoda/webprogrammers_hacking_guide.pdf
Of weet iemand een betere?
Maar daar heb ik stap voor stap wel jullie hulp bij nodig. En wel mensen die veel geduld hebben :)
Eerst laat ik een stuk code zien op de oude manier:
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
28
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
28
<?php
//naam van rubriek en subrubriek
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = ".$_GET['subrubriek_id']."
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
//naam van rubriek en subrubriek
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = ".$_GET['subrubriek_id']."
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
En nu de aangepaste versie:
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
28
29
30
31
32
33
34
35
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
28
29
30
31
32
33
34
35
<?php
//naam van rubriek en subrubriek
//controleren of $_GET['subrubriek_id'] wel een getal is
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = $subrubriek_id
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
//naam van rubriek en subrubriek
//controleren of $_GET['subrubriek_id'] wel een getal is
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = $subrubriek_id
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
Ben ik zo op de juiste weg?
Ik ben trouwens dit bestand aan het doornemen: http://h1.ripway.com/rakoda/webprogrammers_hacking_guide.pdf
Of weet iemand een betere?
Waarom gebruik je geen: mysql_real_escape_string().
Dat is er nou juist voor bedoeld om het risico van SQL-injection weg te nemen. Zet ook voor de zekerheid nog magic-quotes uit.
Dat is er nou juist voor bedoeld om het risico van SQL-injection weg te nemen. Zet ook voor de zekerheid nog magic-quotes uit.
@Aar
Op deze manier?
Op deze manier?
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
28
29
30
31
32
33
34
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
28
29
30
31
32
33
34
<?php
//naam van rubriek en subrubriek
//controle uitvoeren
if (!ini_get('magic_quotes_gpc'))
$subrubriek_id = $_GET['subrubriek_id'];
mysql_real_escape_string($subrubriek_id);
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = '$subrubriek_id'
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
//naam van rubriek en subrubriek
//controle uitvoeren
if (!ini_get('magic_quotes_gpc'))
$subrubriek_id = $_GET['subrubriek_id'];
mysql_real_escape_string($subrubriek_id);
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = '$subrubriek_id'
GROUP BY h.id
";
$result = mysql_query($query) or die (mysql_error());
if(!$result)
{
trigger_error(mysql_error().' ('.$query.')');
}
else
{
$row = mysql_fetch_assoc($result);
echo $row['naam'].' - '.$row['subnaam'];
}
?>
Ik zou onderstaande
vervangen door:
En in je query kun je dan gewoon $_GET['subrubriek_id'] gebruiken ipv $subrubriek_id.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
vervangen door:
Code (php)
1
2
3
2
3
<?php
if (!isset($_GET['subrubriek_id']) || !ctype_digit($_GET['subrubriek_id'])) $_GET['subrubriek_id'] = 1;
?>
if (!isset($_GET['subrubriek_id']) || !ctype_digit($_GET['subrubriek_id'])) $_GET['subrubriek_id'] = 1;
?>
En in je query kun je dan gewoon $_GET['subrubriek_id'] gebruiken ipv $subrubriek_id.
Gewijzigd op 03/02/2011 10:37:41 door Ozzie PHP
Nee...
Zo...
Zo...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = '".mysql_real_escape_string($_GET['subrubriek_id'])."'
GROUP BY h.id
";
?>
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = '".mysql_real_escape_string($_GET['subrubriek_id'])."'
GROUP BY h.id
";
?>
Gewijzigd op 03/02/2011 10:38:06 door - Ariën -
Je controleerd niet of $_GET['subrubriek_id'] wel bestaat.
zou ik het volgende van maken.
is_numeric laat iets te veel door over het algemeen.
WHERE
s.id = $subrubriek_id
wordt dus
WHERE
s.id = ".mysql_real_escape_string($subrubriek_id)."
Die() is tevens ook geen mooie fout afhandeling. Kijk eens op www.phptuts.nl naar de SQL beginners handleiding. Ik zou dan proberen om over te gaan van MySQL naar MySQLi of PDO. Dit zijn geen andere type databases alleen een iets andere manier om met je huidige database te praten zullen we maar zeggen. De MySQL_ functies zijn verouderd.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
zou ik het volgende van maken.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$subrubriek_id = isset($_GET['subrubriek_id']) and ctype_digit($_GET['subrubriek_id']) ? $_GET['subrubriek_id'] : 1 ;
?>
$subrubriek_id = isset($_GET['subrubriek_id']) and ctype_digit($_GET['subrubriek_id']) ? $_GET['subrubriek_id'] : 1 ;
?>
is_numeric laat iets te veel door over het algemeen.
WHERE
s.id = $subrubriek_id
wordt dus
WHERE
s.id = ".mysql_real_escape_string($subrubriek_id)."
Die() is tevens ook geen mooie fout afhandeling. Kijk eens op www.phptuts.nl naar de SQL beginners handleiding. Ik zou dan proberen om over te gaan van MySQL naar MySQLi of PDO. Dit zijn geen andere type databases alleen een iets andere manier om met je huidige database te praten zullen we maar zeggen. De MySQL_ functies zijn verouderd.
Je kunt het toch gewoon om de GET heen zetten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
//naam van rubriek en subrubriek
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = ".mysql_real_escape_string($_GET['subrubriek_id'])."
GROUP BY h.id
";
?>
//naam van rubriek en subrubriek
$query ="
SELECT
h.naam,
s.naam
AS subnaam
FROM
tabel1 AS h
LEFT JOIN
tabel2 AS s
ON
s.hoofdrubriek_id = h.id
WHERE
s.id = ".mysql_real_escape_string($_GET['subrubriek_id'])."
GROUP BY h.id
";
?>
Als je de ctype_digit controle gebruikt dan weet je dat de invoer een getal is en heb je (in dit geval) de mysql_real_escape_string niet nodig.
P.S. Wellicht is het handig om als je hier toch mee aan de slag gaat eens te kijken naar PDO?
P.S. Wellicht is het handig om als je hier toch mee aan de slag gaat eens te kijken naar PDO?
@SanThe
Jij schrijft dit:
en Aar schrijft met nog extra enkele quotes eromheen:
Welke is de juiste?
Toevoeging op 03/02/2011 10:47:27:
Ieder heeft dus zo zijn eigen manier maar waar kan ik me nu het beste in verdiepen?
MySQLi of PDO?
Jij schrijft dit:
en Aar schrijft met nog extra enkele quotes eromheen:
Welke is de juiste?
Toevoeging op 03/02/2011 10:47:27:
Ieder heeft dus zo zijn eigen manier maar waar kan ik me nu het beste in verdiepen?
MySQLi of PDO?
Het ligt eraan tussen wat voor quotes de hele string staat. Ikzelf gebruik voor strings vaak double quotes, tenzij ik een hoop HTML ertussen gooi met double-quotes.
@Mark: lees mijn post van 10:37 en die van jou van 10:38. Bijna precies hetzelfde! Professionals aan het werk :D
Ja het ging nogal behoorlijk dubbel op in een minuut :p
Met PDO kun je ook andere databases aanspreken. Je bent niet gelimiteerd aan alleen MySQL. Ik gebruik zelf MySQLi. Ik moet me zelf ook nog iets meer verdiepen in PDO.
Met PDO kun je ook andere databases aanspreken. Je bent niet gelimiteerd aan alleen MySQL. Ik gebruik zelf MySQLi. Ik moet me zelf ook nog iets meer verdiepen in PDO.
Oké, dan eerst maar even zoeken op de beste Nederlandstalige uitleg van MySQLi en dan zet ik hier af en toe wel weer wat neer om na te laten kijken.
Is deze goed of kan ik beter een boek bestellen: http://phphulp.jorendewit.nl/view/26/
Is deze goed of kan ik beter een boek bestellen: http://phphulp.jorendewit.nl/view/26/
Ik raad je dan aan om niet met MqSQLi te beginnen, maar met PDO:
http://www.phphulp.nl/php/tutorial/overig/pdo-verbinden-met-verschillende-databases/534/inleiding/1364/
en
http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html
http://www.phphulp.nl/php/tutorial/overig/pdo-verbinden-met-verschillende-databases/534/inleiding/1364/
en
http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html
@Ozzie
Dank je, zal ik doen!
Dank je, zal ik doen!
Succes.
Als het gaat om een ID, die altijd numeriek is, is het zeer nutteloos om mysql_real_escape_string te gebruiken.
Gebruik bovenaan bij de check voor je parameter onderstaande, dan hoef je de rest niets te doen:
if(!empty($_GET['id']) && ctype_digit($_GET['id']))
een ID is namelijk nooit 0, en is_nummeric laat komma's toe, ctype_digit niet.
Gebruik bovenaan bij de check voor je parameter onderstaande, dan hoef je de rest niets te doen:
if(!empty($_GET['id']) && ctype_digit($_GET['id']))
een ID is namelijk nooit 0, en is_nummeric laat komma's toe, ctype_digit niet.
Tja, Chris... ik weet niet hoor... :-s
en
Ozzie PHP op 03/02/2011 10:37:13:
Ik zou onderstaande
vervangen door:
En in je query kun je dan gewoon $_GET['subrubriek_id'] gebruiken ipv $subrubriek_id.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
$subrubriek_id = 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>
vervangen door:
Code (php)
1
2
3
2
3
<?php
if (!isset($_GET['subrubriek_id']) || !ctype_digit($_GET['subrubriek_id'])) $_GET['subrubriek_id'] = 1;
?>
if (!isset($_GET['subrubriek_id']) || !ctype_digit($_GET['subrubriek_id'])) $_GET['subrubriek_id'] = 1;
?>
En in je query kun je dan gewoon $_GET['subrubriek_id'] gebruiken ipv $subrubriek_id.
en
Ozzie PHP op 03/02/2011 10:39:10:
Als je de ctype_digit controle gebruikt dan weet je dat de invoer een getal is en heb je (in dit geval) de mysql_real_escape_string niet nodig.
P.S. Wellicht is het handig om als je hier toch mee aan de slag gaat eens te kijken naar PDO?
P.S. Wellicht is het handig om als je hier toch mee aan de slag gaat eens te kijken naar PDO?
Wat is er mis met de uitleg van php.net? mysql_real_escape_string.
@Karl Karl
Met deze uitleg is niks mis maar ik heb al vaker op deze website gekeken en ik snap het gewoon niet. Zal wel aan mij liggen.....
Met deze uitleg is niks mis maar ik heb al vaker op deze website gekeken en ik snap het gewoon niet. Zal wel aan mij liggen.....
@elsy, de uitleg van php.net:
Description
Hier zie je 2 dingen:
- Een code blok met de functie erin:
- Uitleg van wat je met de functie kan doen.
Parameters
Hier zie je per parameter van de code in de description wat het betekend en wat erin moet.
Return Values
Hier staat welke value deze functie terug geeft. Dit is bijv. handig met if/else structeren en voor het echoen.
Examples
Hier zie je code voorbeelden met het resultaat.
Description
Hier zie je 2 dingen:
- Een code blok met de functie erin:
Code (php)
1
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
- Uitleg van wat je met de functie kan doen.
Parameters
Hier zie je per parameter van de code in de description wat het betekend en wat erin moet.
Return Values
Hier staat welke value deze functie terug geeft. Dit is bijv. handig met if/else structeren en voor het echoen.
Examples
Hier zie je code voorbeelden met het resultaat.




