$_GET in SQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ben Janssen

Ben Janssen

19/08/2012 21:20:20
Quote Anchor link
Beste PHPer's,

Ik doe ergens iets fout op regel 26.
Maar ik kom er maar niet uit wat ik fout doe.
Kan iemand mij verder helpen.

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
90
91
92
93
94
95
96
97
98
<?php

/**
 * @author Ben Janssen
 * @copyright 2012
 */


ini_set('display_errors',1);
error_reporting(E_ALL);

//Database connectie
include'../cfg/cfg.php';
mysql_select_db($db,$con);

//GET waarden ophalen
$link = $_GET['confirm'];
if(!$link)
{

    echo '<p>Er is een fout met de link.<br/>Neem contact op met de beheerder als u van mening bent dat dit niet klopt.<br/>[email protected]</p>';
}

else
{
    $sql = "SELECT * FROM reservation WHERE confirm=".$link;
    $res = mysql_query($sql,$con);
    //Waarde controleren
    if(mysql_num_rows($res) == 0)
    {

        echo '<p style="color:red">U heeft nog niet gereserveerd.</p>';
        echo $link;
        header('Refresh: 5; url=../index.html');
    }

    else
    {
        $row = mysql_fetch_array($res);
        if($row['actief'] == 0)
        {

            $sql2 = "UPDATE reservation WHERE confirm=".$link." AND email=".$row['email']."SET actief=1";
            $res2 = mysql_query($sql2,$con);
            if($res2)
            {

                echo '<p>Uw reservering is geactiveerd.<br/>Een bevestiging is naar uw email adres gestuurd';
                header('Refresh: 5; url=../index.html');
                //Headers instellen
                $headers = "From: NoReply@The_Timberwolves.nl\r\n";
                $headers .= 'MIME-Version: 1.0' . "\r\n";
                $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                //Mail opstellen
                $inhoud_mail = ('
                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
                <title>Reservering</title>
                </head>
                <body style="background:silver">
                <p><a href="http://www.thetimberwolves.nl"><img alt="The Timberwolves" height="94" src="http://www.thetimberwolves.nl/img/TTWlogoTrans.gif" width="443" /></a></p>
                <p>Uw reservering is in ons bestand opgenomen.<br/><a href="http://www.thetimberwolves.nl">The Timberwolves</a> zijn blij u op deze dag te mogen verwelkomen.</p>
                <p>Reserverings details</p>
                <table>
                <tr><td style="width:200px">Gereserveerd voor datum</td><td>'
.$row['speeldatum'].'</td></tr>
                <tr><td style="width:200px">Reserveringsnummer</td><td>'
.$row['ID'].'</td></tr>
                <tr><td style="width:200px">Voornaam</td><td>'
.$row['naam'].'</td></tr>
                <tr><td style="width:200px">Achternaam</td><td>'
.$row['anaam'].'</td></tr>
                <tr><td style="width:200px">Team naam</td><td>'
.$row['team'].'</td></tr>
                <tr><td style="width:200px">Aantal dozen</td><td>'
.$row['dozen'].'</td></tr>
                <tr><td style="width:200px">Type paint</td><td>'
.$row['paint'].'</td></tr>
                <tr><td style="width:200px">Totaal incl. WOF</td><td>'
.$row['prijs'].'</td></tr>
                </table>
                <p style="color:red">Print deze mail uit, het is uw ticket.</p>
                <p style="color:red">Let op, er kan niet gepind worden</p>
                <p><img alt="Euro Paintball Adventures" height="94" src="http://www.thetimberwolves.nl/img/EPA.png" width="443" /></p>
                </body>
                </html>'
);
                mail($row['email'],'Uw reservering',$inhoud_mail,$headers);
                
                //Mail voor organisatie opstellen
                $ORsql = "SELECT teamnaam, paint, SUM(dozen) FROM reservation WHERE actief=1 GROUP BY teamnaam, paint";
                $ORres = mysql_query($ORsql,$con);
                $OR2sql = "SELECT COUNT(*) FROM `reservation` WHERE actief=1";
                $OR2res = mysql_query($OR2sql,$con);
                $ORrow = mysql_fetch_array($ORres);
                $OR2row = mysql_fetch_array($OR2res);
                $OR = '[email protected],[email protected]';
                while ($ORrow = mysql_fetch_array($ORres))
                {

                    $ORmail = "===================================================\n";
                    $ORmail .= "Totaal reserveringen ".$OR2row."\n";
                    $ORmail .= "===================================================\n";
                    $ORmail .= "Team * Paint * Totaal\n";
                    $ORmail .= $ORrow['teamnaam']." * ".$ORrow['paint']." * ".$ORrow['SUMdozen']."\n";
                }

                mail($OR,'Reservering is geüpdated',$ORmail,$headers);
            }
        }
    }
}


?>


Toevoeging op 19/08/2012 21:20:45:

Het moet zijn regel 23
 
PHP hulp

PHP hulp

22/11/2024 18:00:16
 
- Ariën  -
Beheerder

- Ariën -

19/08/2012 21:23:27
Quote Anchor link
Ik wete ook niet niet wat je fout doet. Jij weet beter dan ons wat er mis gaat......
 
Ben Janssen

Ben Janssen

19/08/2012 21:36:01
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if(mysql_num_rows($res) == 0)
?>

Geeft een nul waarde, maar $link is wel gevuld.
Wat gaat hier dan fout?
 
Erwin H

Erwin H

19/08/2012 22:05:51
Quote Anchor link
Is 'confirm' een string veld in je database? Dan mis je quotes om de waarde in je query.
 
John Berg

John Berg

19/08/2012 23:33:49
Quote Anchor link
Los van de foutmelding, deze code is extreem gevoelig voor SQL injection.

als ik in de browser invoer http://adresvanjouwsite?confirm=;DROP DATABASE .. ga je helemaal nat. Niet doen dit!
 
Ben Janssen

Ben Janssen

20/08/2012 07:49:53
Quote Anchor link
De "confirm" is een random nummer die in de DB is opgeslagen.

@John,
Hoe moet ik het dan doen?
Want de gebruiker krijgt een bevestigingsmail met link om zijn reservering definitief te maken.
 
Erwin H

Erwin H

20/08/2012 09:14:32
Quote Anchor link
Met random bedoel je hopelijk uniek, anders kan je mogelijk rare dingen krijgen op regel 37/38.

Als het een getal is dan zou ik eens je sql statement echoen om te kijken of inderdaad het getal erin staat en dan checken via de MySQL command line tool of phpmyadmin of er inderdaad wel een record in je database staat met die waarde voor confirm. Het lijkt erop dat dat niet het geval is, vandaar dat 0 records worden opgehaald.
 
John Berg

John Berg

20/08/2012 09:35:27
Quote Anchor link
Ben Janssen op 20/08/2012 07:49:53:
De "confirm" is een random nummer die in de DB is opgeslagen.

@John,
Hoe moet ik het dan doen?
Want de gebruiker krijgt een bevestigingsmail met link om zijn reservering definitief te maken.


Je gebruikt de msqli van php, dat is notoir onveilig. The way to go is om de pdo driver te gebruiken, en dan parameter binding te gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
$link = $_GET['confirm'];

..
$db = new PDO("...");
$sql = "SELECT * FROM reservation WHERE confirm = :link"
$statement = $db->prepare($sql);
$statement->execute(array(':link' => $link));

$res = $statement->fetch();


n.b. is het geen idee om php en sql te scheiden van de html opmaak. Zal de leesbaarheid en onderhoudbaarheid zeker ten goede komen?

Wat bijvoorbeeld al gaat helpen is dit: Zet de inhoud van de mail in een apart bestand en noem dat mail.html Verander regel 48 in :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$inhoud_mail = file_get_contents('mail.html');

Op die manier wordt de code leesbaarder, en als je de mail ooit wil veranderen hoef je alleen maar het mail.html bestand aan te passen. Bovendien kun je mail.html apart in je browser weergeven, zodat je kunt zien hoe de gebruiker de mail gaat zien.
Gewijzigd op 20/08/2012 09:41:42 door John Berg
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/08/2012 16:07:05
Quote Anchor link
John Berg op 20/08/2012 09:35:27:
Je gebruikt de msqli van php, dat is notoir onveilig. The way to go is om de pdo driver te gebruiken, en dan parameter binding te gebruiken:

Waarom zou mysqli onveilig zijn? TS gebruikt overigens de mysql extensie en in beide kun je escapen.
 
John Berg

John Berg

20/08/2012 16:26:11
Quote Anchor link
@Ger: Ik heb me misschien wat ongenuanceerd uitgedrukt.
Dit van mysqli:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();


is equivalent aan dit van pdo_mysql;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array(':name' => $name));


Ik ben geen fan van escapen. Waarom zou je ook als je met parameter binding altijd safe bent?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/08/2012 16:48:56
Quote Anchor link
]Omdar parameter binding altijd in combinatie moet met prepared statements, en dat laatste vind ik overbodig op één enkele query.

[totopic]
@Ben
Je zegt dat confirm een random number is, maar ik meen in jou topic van eergisteren gezien te hebben dat je daar een MD5 hash overheen gooit.
Overigens is een rand(1000, 100000) niet uniek, dus kan je zoals Erwin al aangaf problemen krijgen met de bevestiging.
[/totopic]
Gewijzigd op 20/08/2012 16:55:41 door Ger van Steenderen
 
Ben Janssen

Ben Janssen

20/08/2012 19:33:34
Quote Anchor link
Dat param binding snap ik echt niets van.

Ik weet wel dat er in &link de juiste waarde staat, deze had ik al gecontroleerd omdat ik een "0" waarde kreeg, sterker nog, hij staat zelfs in de DB.

Ik moet dus ergens een fout hebben in de SQL.

@Ger,
Zou dit een betere regel zijn voor een uniek nummer?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$confirm
= md5(rand(1000,100000)$_POST['email'])
?>


Toevoeging op 20/08/2012 19:35:20:

En de mail in een extern bestand zetten is ook de bedoeling, maar wil eerst zeker weten dat alles goed werkt.
 
Write Down

Write Down

20/08/2012 19:41:14
Quote Anchor link
Wat begrijp je niet aan param binding?

Overigens is de manier waarop je je md5 maakt nog steeds niet erg veilig. Een random cijfer toevoegen is niet voldoende. Je kan beter een aantal random tekens toevoegen: @-4Hm$ó° . Overigens is sha1 een sterker algoritme.
Gewijzigd op 20/08/2012 19:41:35 door Write Down
 
Ben Janssen

Ben Janssen

20/08/2012 19:47:43
Quote Anchor link
sha1 werkt op de zelfde manier?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$confirm
= sha1(rand(1000,100000)$_POST['email'])
?>


Dat param binding is nieuw voor mij, zie ik hier voor het eerst.
Dus daar zal ik nog wat meer over moeten weten voor ik goed begrijp wat het doet.
Allicht het zelfde als wat ik wil.
 
John Berg

John Berg

20/08/2012 20:05:14
Quote Anchor link
Als ik een unieke string wil hebben doe ik altijd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
define('MY_SALT', 'kN@lF44f' );
$confirm = MD5( MY_SALT . uniqid() );
?>


De uniqid() geeft al een iets unieks, maar omdat ik altijd bang ben dat anderen ook deze functie gebruiken, SALT ik hem ietwat.

De resulterende string is met aan zekerheid grenzende waarschijnlijkheid uniek :-)
Gewijzigd op 20/08/2012 20:06:05 door John Berg
 
Ben Janssen

Ben Janssen

20/08/2012 20:08:30
Quote Anchor link
Oke, dat is wel handig om te weten.

En beide parameters kun je naar eigen inzicht aanpassen?
 
John Berg

John Berg

20/08/2012 20:14:06
Quote Anchor link
Ben Janssen op 20/08/2012 20:08:30:
Oke, dat is wel handig om te weten.

En beide parameters kun je naar eigen inzicht aanpassen?


Yep. Als je er maar voor zorgt dat de lengte van je SALT minimaal 8 tekens is, je hoofd- en kleine letters, cijfers en leestekens gebruikt.
 
Ben Janssen

Ben Janssen

20/08/2012 20:31:14
Quote Anchor link
Super.

Nu nog even uitvogelen wat er met de num_rows aan de hand 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.