gastenboek met captcha geeft aan code niet juist
Ik heb een probleempje waar ik zo niet uit kom.
Ik heb een gastenboek gemaakt en van het internet een captcha code gehaald,
deze heb ik in mijn script verwerkt maar als ik de code invul dan blijft
mijn script zeggen dat de code niet juist is.
misschien iemand hier een idee.
dit is de image(captcha) code
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
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
<?php
// -----------------------------------------
// The Web Help .com
// -----------------------------------------
header('Content-type: image/jpeg');
$width = 50;
$height = 24;
$my_image = imagecreatetruecolor($width, $height);
imagefill($my_image, 0, 0, 0xFFFFFF);
// add noise
for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}
$x = rand(1,10);
$y = rand(1,10);
$rand_string = rand(1000,9999);
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000);
setcookie('tntcon',(md5($rand_string).'a4xn'));
imagejpeg($my_image);
imagedestroy($my_image);
?>
// -----------------------------------------
// The Web Help .com
// -----------------------------------------
header('Content-type: image/jpeg');
$width = 50;
$height = 24;
$my_image = imagecreatetruecolor($width, $height);
imagefill($my_image, 0, 0, 0xFFFFFF);
// add noise
for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}
$x = rand(1,10);
$y = rand(1,10);
$rand_string = rand(1000,9999);
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000);
setcookie('tntcon',(md5($rand_string).'a4xn'));
imagejpeg($my_image);
imagedestroy($my_image);
?>
dit is mijn gastenboek
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
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
<div id="gastenboek">
<h1>Gastenboek</h1>
Wij van het apolloteam zouden het leuk vinden als u een berichtje achterlaat.
<form method="post" action="">
<table width="100%">
<tr>
<td width="15%" style="border:none;">Naam:</td>
<td style="border:none;"><input type="text" name="naam" /></td>
</tr>
<tr>
<td style="border:none;">Email:</td>
<td style="border:none;"><input type="text" name="email" /></td>
</tr>
<tr>
<td style="border:none;">Bericht:</td>
<td style="border:none;"><textarea cols="50" rows="10" name="bericht"></textarea></td>
</tr>
<tr>
<td style="border:none;">Verificatie code</td>
<td style="border:none;"><input type="text" name="verificatie" align="top" /> <img src="../includes/captcha.php?<?php echo rand(0,9999);?>" alt="verificatie code" width="50" height="24" align="top" /></td>
</tr>
<tr>
<td style="border:none;"><input type="submit" name="gastenboek" value="Verstuur" /></td>
</tr>
</table>
</form>
<?php echo '<font color="red">'.$fout.'</font>'; ?>
</div>
<div id="berichten">
<?php
$sql_gastenboek = "SELECT naam,bericht,datum,email, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum FROM gastenboek ORDER BY datum DESC LIMIT 10";
if(!$result = $mysqli->query($sql_gastenboek))
{
echo "Er is een fout opgetreden onze excusus voor het ongemak!";
}
else
{
$count = $result->num_rows;
if($count < 1)
{
echo "er zijn nog geen berichten";
}
else
{
while($row = $result->fetch_assoc())
{
echo '
<div id="titel">
<table width="100%">
<tr>
<td style="border:none;">Datum:</td>
<td style="border:none; width:150px;">'.$row['datum'].'</td>
<td style="border:none;">Door:</td>
<td style="border:none; width:100px;">'.$row['naam'].'</td>
<td style="border:none;">Email:</td>
<td style="border:none;">'.$row['email'].'</td>
</tr>
</table>
</div>
<div id="bericht1">
<table width="100%">
<tr>
<td width="15%" style="border:none;"><img src="images/01.png" alt="blaat" /></td>
<td style="border:none;">'.$row['bericht'].'</td>
</tr>
</table>
</div><br />';
}
}
}
echo var_dump($_POST);
?>
</div>
<h1>Gastenboek</h1>
Wij van het apolloteam zouden het leuk vinden als u een berichtje achterlaat.
<form method="post" action="">
<table width="100%">
<tr>
<td width="15%" style="border:none;">Naam:</td>
<td style="border:none;"><input type="text" name="naam" /></td>
</tr>
<tr>
<td style="border:none;">Email:</td>
<td style="border:none;"><input type="text" name="email" /></td>
</tr>
<tr>
<td style="border:none;">Bericht:</td>
<td style="border:none;"><textarea cols="50" rows="10" name="bericht"></textarea></td>
</tr>
<tr>
<td style="border:none;">Verificatie code</td>
<td style="border:none;"><input type="text" name="verificatie" align="top" /> <img src="../includes/captcha.php?<?php echo rand(0,9999);?>" alt="verificatie code" width="50" height="24" align="top" /></td>
</tr>
<tr>
<td style="border:none;"><input type="submit" name="gastenboek" value="Verstuur" /></td>
</tr>
</table>
</form>
<?php echo '<font color="red">'.$fout.'</font>'; ?>
</div>
<div id="berichten">
<?php
$sql_gastenboek = "SELECT naam,bericht,datum,email, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum FROM gastenboek ORDER BY datum DESC LIMIT 10";
if(!$result = $mysqli->query($sql_gastenboek))
{
echo "Er is een fout opgetreden onze excusus voor het ongemak!";
}
else
{
$count = $result->num_rows;
if($count < 1)
{
echo "er zijn nog geen berichten";
}
else
{
while($row = $result->fetch_assoc())
{
echo '
<div id="titel">
<table width="100%">
<tr>
<td style="border:none;">Datum:</td>
<td style="border:none; width:150px;">'.$row['datum'].'</td>
<td style="border:none;">Door:</td>
<td style="border:none; width:100px;">'.$row['naam'].'</td>
<td style="border:none;">Email:</td>
<td style="border:none;">'.$row['email'].'</td>
</tr>
</table>
</div>
<div id="bericht1">
<table width="100%">
<tr>
<td width="15%" style="border:none;"><img src="images/01.png" alt="blaat" /></td>
<td style="border:none;">'.$row['bericht'].'</td>
</tr>
</table>
</div><br />';
}
}
}
echo var_dump($_POST);
?>
</div>
En hier wordt het verwerkt en gecontroleerd.
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
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
<?php
//Controle gastenboek//
if($_SERVER['REQUEST_METHOD'] == "POST")
{
if(isset($_POST['gastenboek']))
{
$naam = $mysqli->real_escape_string($_POST['naam']);
$email = $mysqli->real_escape_string($_POST['email']);
$bericht = $mysqli->real_escape_string($_POST['bericht']);
$code = $_POST['verificatie'];
if($naam == "")
{ $fout = "U heeft geen naam opgegeven!"; }
elseif ($email == "")
{ $fout = "U heeft geen email opgegeven!"; }
elseif ($bericht == "")
{ $fout = "U hebt geen bericht ingetypt!"; }
elseif ($checkmail == checkmail($email))
{ $fout = "Uw mail adress is niet goed!"; }
else
{
if(md5($code).'a4xn' == $_COOKIE['tntcon'])
{
//als verificatie goed is gegaan dan posten.
$sql = "INSERT INTO gastenboek (id,naam,email,ip_adrr,bericht,datum) VALUE (NULL,'".$naam."','".$email."','".$ipadress."','".$bericht."',NOW())";
if(!$result = $mysqli->query($sql))
{
sqlError('Er is een fout gevonden bij het verwerken van de data.<br />Onze excuses voor het ongemak.<br />De beheerder is op de hoogte gesteld.');
notify('Probleem met de query:'.$mysqli->error.' in control.php op lijn 51 op datum '.date("Y-m-d").'');
}
else
{
$fout = "Bericht is verstuurd";
}
//Cookie verwijderen zodat er niet op f5 kan worden gedrukt.
setcookie('tntcon','');
}
else
{
$fout = "De ingevulde code kwam niet overeen";
}
}
}
}
?>
//Controle gastenboek//
if($_SERVER['REQUEST_METHOD'] == "POST")
{
if(isset($_POST['gastenboek']))
{
$naam = $mysqli->real_escape_string($_POST['naam']);
$email = $mysqli->real_escape_string($_POST['email']);
$bericht = $mysqli->real_escape_string($_POST['bericht']);
$code = $_POST['verificatie'];
if($naam == "")
{ $fout = "U heeft geen naam opgegeven!"; }
elseif ($email == "")
{ $fout = "U heeft geen email opgegeven!"; }
elseif ($bericht == "")
{ $fout = "U hebt geen bericht ingetypt!"; }
elseif ($checkmail == checkmail($email))
{ $fout = "Uw mail adress is niet goed!"; }
else
{
if(md5($code).'a4xn' == $_COOKIE['tntcon'])
{
//als verificatie goed is gegaan dan posten.
$sql = "INSERT INTO gastenboek (id,naam,email,ip_adrr,bericht,datum) VALUE (NULL,'".$naam."','".$email."','".$ipadress."','".$bericht."',NOW())";
if(!$result = $mysqli->query($sql))
{
sqlError('Er is een fout gevonden bij het verwerken van de data.<br />Onze excuses voor het ongemak.<br />De beheerder is op de hoogte gesteld.');
notify('Probleem met de query:'.$mysqli->error.' in control.php op lijn 51 op datum '.date("Y-m-d").'');
}
else
{
$fout = "Bericht is verstuurd";
}
//Cookie verwijderen zodat er niet op f5 kan worden gedrukt.
setcookie('tntcon','');
}
else
{
$fout = "De ingevulde code kwam niet overeen";
}
}
}
}
?>
Alvast bedankt.
Tips voor het verbeteren heb ik wat aan.
Geen afkraak gedoe want dat kunnen we allemaal.
Met vriendelijke groet,
Thomas de Vries.
Gewijzigd op 19/04/2011 21:02:33 door Thomas de vries
2. gebruik geen cookies maar session
3. ik heb een hekel aan mensen die overbodige variabelen aanmaken
4. zorg er voor dat: de "image(captcha) code" correct functioneerd
5. zorg er voor dat je debug modes hebt aanstaan
6. leer op correcte manier consequent quoten
een paar punten snap ik goed.
dat is punt 3 en punt 2
punt 3 is toch naar ieders eigen mening. ik ben de scripter en ik bepaal uiteindelijk hoe het eruit komt te zien.
maar punt 1 volg ik niet hoe kan ik het nog beter valideren/controleren.
ik heb alle mogelijke sql injections geprobeerd die ik ken. en ik kan de db niet in komen op die manier.
punt 6 snap ik ook niet helemaal. wat je daarmee bedoelt.(denk de uitleg wat ik erbij heb).
de captcha code functioneert wel op de site zelf misschien iets misgegaan met kopieren zal er nog eens dieper in gaan kijken.
Gewijzigd op 19/04/2011 21:22:14 door thomas de vries
Quote:
punt 3 is toch naar ieders eigen mening. ik ben de scripter en ik bepaal uiteindelijk hoe het eruit komt te zien.
Welk nut heeft het om "1000" variabelen te hebben met dezelfde inhoud, daar gaat het om!
Quote:
punt 6 snap ik ook niet helemaal. wat je daarmee bedoelt.(denk de uitleg wat ik erbij heb).
alle strings quoten met enkele quote, dat dwingt je dan wel om php variabelen buiten de string te zetten, maar dat is wel zo overzichtelijk. Er zijn uiteraard uitzonderingen:
- SQL statements quote je met ""
- en de \r \n \t
Quote:
1
oh dus jij vindt dat isset met een == '' afdoende is
Quote:
2
http://www.php.net/cookie
En dan goed lezen wanneer een cookie nu daadwerkelijk als bekend beschouwd wordt
Ik heb het bijna opgelost.
maar kom nu tegen de volgende fout aan
als ik in mijn form dit doe
<form method="post" action="../includes/control.php">
Dan gaat ie na de submit naar die control heen dan werkt die captcha code wel.
Maar als ik action leeg laat dan blijft ie zeggen code is fout.
en dat terwijl ik mijn control wel include.
want daar moet ie controleren of alles goed gaat.
hoe kan ik dit oplossen.
met vriendelijke groet,
Thomas de vries.
Relevante code?
de relevante code is hierboven te vinden.
dat is alle relevante code.
Je meot even debuggen wat de waardes uit je cookie zijn, en uit de MD5 hash.
maar bij form action het bestand inplak waar die de controles moet uitvoeren het wel doet.
Dus de captcha doet het wel maar alleen als je dus de form action gebruikt.
BTW hoe doe je dat debuggen van de md5 hash dan.
Ik weet wat er in staat.
het gaat om een random getal tussen de 1000 en de 9999.
en er wordt a4xn achter geplakt.
Edit:
heb error reporting boven aan gezet.
en krijg deze melding
Notice: Undefined index: tntcon in F:\server\htdocs\apolloteam\pages\gastenboek.php on line 59
ik denk dat het daarmee te maken heeft.
maar dacht dat index alleen maar te maken heeft met variabelen en niet met cookie.
de regel is namelijk als volgt.
if(md5($_POST['verif_box']).'a4xn' == $_COOKIE['tntcon'])
Toevoeging op 20/04/2011 10:30:29:
ik ben er uit hij zet de cookie niet.
wel vreemd maar zal is kijken hoe dat komt.
Toevoeging op 20/04/2011 11:22:10:
Edit 2:
Problemen zijn nu opgelost
pfff wat een gedoe.
had iets niet goed met de includes.
Gewijzigd op 20/04/2011 10:18:20 door thomas de vries
Sterker: Wanneer de gebruiker geen cookies accepteerd van je site zal die niet bestaan en zal PHP een error geven zoals je al zei.
Gebruik daarom ipv $_COOKIE $_SESSION['tntcon'] zoals hierboven al was gezegd. Dit doe je door boven elk script waarin de variable $_SESSION['tntcon'] wordt gebruikt de sessie te starten mbv session_start();
Waardes in $_SESSION['tntcon'] zetten gaat alsvolgt:
Bij het uitlezen van variables die je uit een ander script haalt zoals $_GET, $_POST, $_SESSION en $_COOKIE zou ik altijd controlleren of ze echt bestaan dmv isset($_SESSION['tntcon']) toe te voegen aan je bestaande controlles.
Succes!