SQL injection tegengaan met OOP database verbinging
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:
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! ;)
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: 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)
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
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>';
}
}
}
?>
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
PDO want pdo is veel beter dan mysqli.
Met mysqli kan je ook nog gebruik maken van prepared statements. Maar dan kan je eigenlijk beter direct over gaan op 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?
mysqli.real-escape-string is de simpelste oplossing.
class.mysqli-stmt kan je gebruiken voor prepared statements.
Nee, PDO is geen opvolger van mysqli. Maar een alternatief. class.mysqli-stmt kan je gebruiken voor prepared statements.
Code (php)
1
2
3
2
3
<?php
$sql = "INSERT INTO subscriptions VALUES ('', '" . mysqli_real_escape_string($firstname) . "', '" . mysqli_real_escape_string($lastname) . "', '" . mysqli_real_escape_string($email) . "', '" . $date . "')";
?>
$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
Ow, is het dan zo simpel? Bedankt hoor, ik probeer het meteen uit! ;)
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.
wat is het verschil tussen mysqli en MySQL?
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.
Pim - op 17/11/2010 09:27:52:
Hoezo veel beter? Als je alleen MySQL gebruikt, voldoet mysqli toch ook prima? Het is nog sneller ook.
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.