Doe ik anti SQLinjection zo op de juiste manier?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

03/02/2011 10:18:12
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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'];
        }

        ?>


En nu de aangepaste versie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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'];
        }

        ?>


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?
 
PHP hulp

PHP hulp

14/11/2024 18:29:52
 
- Ariën  -
Beheerder

- Ariën -

03/02/2011 10:19:40
Quote Anchor link
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.
 

03/02/2011 10:34:42
Quote Anchor link
@Aar

Op deze manier?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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'];
        }

        ?>
 
Ozzie PHP

Ozzie PHP

03/02/2011 10:37:13
Quote Anchor link
Ik zou onderstaande

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$subrubriek_id
= 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>


vervangen door:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
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
 
- Ariën  -
Beheerder

- Ariën -

03/02/2011 10:37:31
Quote Anchor link
Nee...

Zo...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
    "
;    
?>
Gewijzigd op 03/02/2011 10:38:06 door - Ariën -
 
- Mark -

- Mark -

03/02/2011 10:38:10
Quote Anchor link
Je controleerd niet of $_GET['subrubriek_id'] wel bestaat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

    $subrubriek_id
= 1; // (default)
    if (is_numeric($_GET['subrubriek_id']))
    $subrubriek_id = $_GET['subrubriek_id'];

?>


zou ik het volgende van maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

    $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.
 
- SanThe -

- SanThe -

03/02/2011 10:38:13
Quote Anchor link
Je kunt het toch gewoon om de GET heen zetten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
    "
;    
?>
 
Ozzie PHP

Ozzie PHP

03/02/2011 10:39:10
Quote Anchor link
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?
 

03/02/2011 10:43:23
Quote Anchor link
@SanThe

Jij schrijft dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
".mysql_real_escape_string($_GET['subrubriek_id'])."
?>

en Aar schrijft met nog extra enkele quotes eromheen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
'".mysql_real_escape_string($_GET['subrubriek_id'])."'
?>


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?
 
- Ariën  -
Beheerder

- Ariën -

03/02/2011 10:50:05
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

03/02/2011 11:02:12
Quote Anchor link
@Mark: lees mijn post van 10:37 en die van jou van 10:38. Bijna precies hetzelfde! Professionals aan het werk :D
 
- Mark -

- Mark -

03/02/2011 11:23:42
Quote Anchor link
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.
 

03/02/2011 11:28:53
Quote Anchor link
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/
Gewijzigd op 03/02/2011 11:32:10 door
 
Ozzie PHP

Ozzie PHP

03/02/2011 11:33:53
 

03/02/2011 11:35:29
Quote Anchor link
@Ozzie

Dank je, zal ik doen!
 
Ozzie PHP

Ozzie PHP

03/02/2011 11:36:06
Quote Anchor link
Succes.
 
Chris -

Chris -

03/02/2011 13:15:50
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

03/02/2011 13:19:27
Quote Anchor link
Tja, Chris... ik weet niet hoor... :-s


Ozzie PHP op 03/02/2011 10:37:13:
Ik zou onderstaande

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$subrubriek_id
= 1; // (default)
if (is_numeric($_GET['subrubriek_id']))
$subrubriek_id = $_GET['subrubriek_id'];
?>


vervangen door:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
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?
 

03/02/2011 13:29:42
Quote Anchor link
Wat is er mis met de uitleg van php.net? mysql_real_escape_string.
 

03/02/2011 13:34:58
Quote Anchor link
@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.....
 
Wouter J

Wouter J

03/02/2011 13:41:02
Quote Anchor link
@elsy, de uitleg van php.net:
Description
Hier zie je 2 dingen:
- Een code blok met de functie erin:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.