SQL injection tegengaan met OOP database verbinging

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sam Clauw

Sam Clauw

16/11/2010 16:49:27
Quote Anchor link
Ik ben al een tijdje op zoek op welke manier ik het best SQL injection in m'n websites tegen ga. Op verschillende websites lijkt dit heel simpel te zijn: "gewoon" de functie mysql_real_escape_string() integreren. Info vond ik onder andere op: http://php.net/manual/en/function.mysql-real-escape-string.php. Ondertussen weet ik dat die functie NA de verbinding met een database geïntegreerd moet worden, maar dat is dan ook alles.

Wanneer ik deze functie uitprobeerde, kreeg ik jammer genoeg verschillende warnings. Ik hechtte er enkele weken terug geen verder belang meer aan en liet het wat rusten. Ondertussen zit ik met een database van 800+ e-mail adressen die via een inschrijvingsformulier bij worden gehouden. Het lijkt me vanaf nu wél verstandig om die SQL injectie serieus te nemen!

Weet er iemand hoe ik op een correcte manier de functie "mysqli_real_escape_string()" in de volgende code stop:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php

if (isset($_POST['submit']) && $_POST['check'] == ''){
    
    $mail = new phpmailer();
    
    // HTML-tags en PHP-code verwijderen
    
    $firstname    = strip_tags($_POST['firstname']);
    $lastname    = strip_tags($_POST['lastname']);
    $email        = strip_tags($_POST['email']);
    
    // Witruimte(s) aan het begin en einde van de string weghalen
    
    $firstname    = trim($firstname);
    $lastname    = trim($lastname);
    $email        = trim($email);
    
    $mail->SetFrom('[email protected]','GoldDigger'); // e-mail & naam van de persoon of website die de e-mail stuurt
    $mail->AddAddress($email, $firstname . ' ' . $lastname); // e-mail & naam van de ontvanger
    
    $mail->Priority    = 3; //(1 = High, 3 = Normal, 5 = low)
    $mail->CharSet    = 'UTF-8';
    $mail->Subject    = 'Download uw V.I.P. ticket'; // onderwerp e-mail
    $mail->IsHTML(true); // e-mail als XHTML versturen
    
    // E-mail in XHTML opbouwen

    
    $mail->Body        = '<html><head><title></title></head><body>';
    $mail->Body        .= '<p>Beste ' . $firstname . ',</p>';
    $mail->Body        .= '<p>bedankt voor uw registratie. Hier kunt u uw V.I.P. ticket downloaden:</p>';
    $mail->Body        .= '<p>www.golddigger.be/VIP_ticket_dec2010.pdf</p>';
    $mail->Body        .= '<p>Tot binnenkort,<br />';
    $mail->Body        .= 'het GoldDigger team.</p>';
    $mail->Body        .= '</body></html>';

    $subscription = new mysqli(MYSQL_SERVER,MYSQL_USER,MYSQL_PASS,MYSQL_DB);
    $subscription->set_charset('utf8');
    
    $sql = "SELECT email FROM subscriptions WHERE email = '" . $email . "'";
    
    if(!$result = $subscription->query($sql)){
        trigger_error('Fout in query:' . $subscription->error);
    }
else{
        $count = 0;
        $count = $result->num_rows;
        
        
        
        /*
        // SQL injectie tegengaan (tijdelijke plaats)
        
        $firstname    = mysqli_real_escape_string($_POST['firstname']);
        $lastname    = mysqli_real_escape_string($_POST['lastname']);
        $email        = mysqli_real_escape_string($_POST['email']);
        */

        
        
        
        
        if($count == 0){
            $sql = "INSERT INTO subscriptions VALUES ('', '" . $firstname . "', '" . $lastname . "', '" . $email . "', '" . $date . "')";
            
            // Ingevulde formuliergegevens naar database sturen
            
            if(!$result = $subscription->query($sql)){
                trigger_error('Fout in query:' . $subscription->error);
            }

            
            //Formulier verzenden
        
            if(!$mail->Send()){
                $send    = FALSE;
                $info    = '<h2>Uw bericht kon niet worden verzonden.</h2>';
                $info    .= '<p>Probeer het later nog een keer.</p>';
            }
else{
                $send    = TRUE;
                $info    = '<h2>Hartelijk dank voor uw registratie!</h2>';
                $info    .= '<p>U ontvangt binnenkort een e-mail met uw V.I.P. ticket.</p>';
            }
            
        }
else{
            $send    = FALSE;
            $info    = '<h2>U bent al geregistreerd.</h2>';    
        }
    }
}


?>


Ik keek reeds verschillende malen op http://php.net/manual/en/mysqli.real-escape-string.php, maar in de voorbeelden die men geeft gebruikt men een totaal andere opbouw van de databaseverbinding. O wat zal ik jullie dankbaar zijn moesten jullie me op de goede weg kunnen helpen! ;)
Gewijzigd op 16/11/2010 16:53:28 door Sam Clauw
 
PHP hulp

PHP hulp

22/11/2024 19:52:39
 

16/11/2010 16:52:34
Quote Anchor link
Met mysqli kan je ook nog gebruik maken van prepared statements. Maar dan kan je eigenlijk beter direct over gaan op PDO want pdo is veel beter dan mysqli.
 
Sam Clauw

Sam Clauw

16/11/2010 16:57:46
Quote Anchor link
Haha, nu ben ik helemaal het noorden kwijt hoor ;). Is die PDO dan een soort opvolger van mysqli? En weet jij misschien een oplossing om het toch via mysqli te doen?
 

16/11/2010 17:04:26
Quote Anchor link
Nee, PDO is geen opvolger van mysqli. Maar een alternatief. mysqli.real-escape-string is de simpelste oplossing.
class.mysqli-stmt kan je gebruiken voor prepared statements.
 
Yea Rupie

Yea Rupie

16/11/2010 17:09:27
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= "INSERT INTO subscriptions VALUES ('', '" . mysqli_real_escape_string($firstname) . "', '" . mysqli_real_escape_string($lastname) . "', '" . mysqli_real_escape_string($email) . "', '" . $date . "')";
?>
Gewijzigd op 16/11/2010 17:09:54 door Yea Rupie
 
Sam Clauw

Sam Clauw

17/11/2010 08:38:56
Quote Anchor link
Ow, is het dan zo simpel? Bedankt hoor, ik probeer het meteen uit! ;)
 
Pim -

Pim -

17/11/2010 09:27:52
Quote Anchor link
Karl Karl op 16/11/2010 16:52:34:
Met mysqli kan je ook nog gebruik maken van prepared statements. Maar dan kan je eigenlijk beter direct over gaan op PDO want pdo is veel beter dan mysqli.


Hoezo veel beter? Als je alleen MySQL gebruikt, voldoet mysqli toch ook prima? Het is nog sneller ook.
 
Teun Hesseling

Teun Hesseling

17/11/2010 09:37:59
Quote Anchor link
wat is het verschil tussen mysqli en MySQL?
 
Jelmer -

Jelmer -

17/11/2010 09:48:59
Quote Anchor link
mysqli is een verbeterde versie. Simpel uitgelegd, de mysql_* functies waren gemaakt door de mensen van MySQL zelf, en de mysqli_* zijn gemaakt door de mensen van PHP. En de mensen van PHP weten het beste wat het beste is voor PHP.
 

17/11/2010 10:29:26
Quote Anchor link
Pim - op 17/11/2010 09:27:52:
Karl Karl op 16/11/2010 16:52:34:
Met mysqli kan je ook nog gebruik maken van prepared statements. Maar dan kan je eigenlijk beter direct over gaan op PDO want pdo is veel beter dan mysqli.


Hoezo veel beter? Als je alleen MySQL gebruikt, voldoet mysqli toch ook prima? Het is nog sneller ook.

Mysqli heeft problemen gehad met dat je niet OOP kon controleren of je verbonden was. Mysqli heeft soms problemen met quotes (en nee, mijn queries zijn goed). Mysqli is mysql omgeschreven naar soort van oop. Mysqli werkt kut met prepared statements (het binden van variabelen). Mysqli verplicht je soms tot het storen van results. Mysqli kan soms maar één ding te gelijk. Mysqli kan niet data direct in een object stoppen (alleen een object terug geven).
Dat lijkt mij wel wel genoeg punten om aan te geven dat PDO beter is.
 



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.