Doe ik anti SQLinjection zo op de juiste manier?
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?
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.
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'];
}
?>
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
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 -
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.
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
";
?>
P.S. Wellicht is het handig om als je hier toch mee aan de slag gaat eens te kijken naar 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
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.
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
Dank je, zal ik doen!
Succes.
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.
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?
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.....
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.