Captcha probleem
ik heb een tutje gevolgd over captcha's en dan aangepast in mijn eigen formulier. Ik denk dat het fout loopt bij het checken of de captcha juist is of niet.
Hieronder de 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$error = array();
if(!preg_match("/^[-_0-9a-z]{2,}$/i", $_POST['naam'])) {
$error[] = 'Een naam mag slechts alfanummerieke tekens bevatten (a-z, 0-9), underscore (_) of liggend streepje (-).';
}
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['AntiSpam']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
$fouten = sizeof($error); // aantal errors tellen
if($fouten != 0) { // Er is minstens 1 error
echo 'Het bericht kon niet worden verzonden omwille van de volgende reden(en):';
echo '<ul>';
for($i = 0; $i < $fouten; $i++) {
echo '<li>'.$error[$i].'</li>';
}
echo '</ul>';
?>
$error = array();
if(!preg_match("/^[-_0-9a-z]{2,}$/i", $_POST['naam'])) {
$error[] = 'Een naam mag slechts alfanummerieke tekens bevatten (a-z, 0-9), underscore (_) of liggend streepje (-).';
}
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['AntiSpam']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
$fouten = sizeof($error); // aantal errors tellen
if($fouten != 0) { // Er is minstens 1 error
echo 'Het bericht kon niet worden verzonden omwille van de volgende reden(en):';
echo '<ul>';
for($i = 0; $i < $fouten; $i++) {
echo '<li>'.$error[$i].'</li>';
}
echo '</ul>';
?>
captcha.php
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
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
<?php
// Start de Session die nodig is om de Captcha code te gebruiken.
session_start();
// Lijst met alle letters en cijfers die gebruikt worden om de Captcha aan te maken.
// Ik heb ervoor gekozen om een aantal letters en cijfers weg te laten aangezien deze veel op elkaar lijken (1, i).
$Characters = '23456789abcdefghjklmnpqrstuvwxyz';
// Aantal tekens dat gebruikt wordt om de Captcha aan te maken.
// Ik heb het aantal ingesteld op 5 , jasper heeft het veranderd naar 7
$chars = 7;
// Stel hieronder de afmetingen voor de Captcha afbeelding in.
// Ik heb gekozen voor 150 pixels breed bij 50 pixels hoog.
$Width = 200;
$Height = 40;
// Maak de Captcha code aan. De code hieronder kiest willekeurig het aantal tekens uit dat is vastgelegd.
// In het geval van dit voorbeeld worden er 5 willekeurige tekens gekozen uit de lijst $Characters
$i = 0;
while ($i < $chars)
{
$randomnr .= substr($Characters, mt_rand(0, strlen($Characters)-1), 1);
$i++;
}
// Schrijf de aangemaakte Captcha code weg in een Session.
// Ik versleutel de code met een md5 hash zodat de code niet zomaar uit de Session te lezen is.
$_SESSION['randomnr2'] = md5($randomnr);
// Start met het aanmaken van de afbeelding.
$im = imagecreatetruecolor($Width, $Height);
// Bepaal de kleuren die je wilt gebruiken. Deze Captcha maakt gebruik van 3 kleuren.
// Kleur 1: $front is de Captcha Code waar het uitenidelijk om draait.
// Kleur 2: $shadow is de schaduw die ik achter de Captcha Code schrijf.
// Kleur 3: $background is de achtergrond kleur van de gehele Captcha afbeelding.
$front = imagecolorallocate($im, 255, 255, 255);
$shadow = imagecolorallocate($im, 128, 128, 255);
$background = imagecolorallocate($im, 6, 51, 125);
// Vul de aangemaakt afbeelding met de hierboven ingestelde achtergrond kleur.
imagefilledrectangle($im, 0, 0, $Width, $Height, $background);
// Stel het True Type Font in dat je wilt gaan gebruiken.
// Zorg ervoor dat je de juiste locatie van je .ttf bestand invult.
// Voor deze Captcha maak ik gebruik van Artbrush.ttf
$font = 'arial.ttf';
// Stel de max. en min. hoek in waarmee je de Captcha weg wilt schrijven. Gebruik hiervoor een getal tussen de 0 en 15.
// Deze hoeken worden hierna willekeurig bepaalt aan de hand van de ingestelde max. en min. waarden.
// $angle1 is de hoek waarin de Schaduw van de Captcha code wordt weergegeven.
// $angle2 is de hoek waarin de Captcha code zelf wordt weergegeven.
$angle1 = rand(-12, 12);
$angle2 = rand(-12, 12);
// Schrijf de Schaduw van de Captcha op de afbeelding.
// Het eerste getal (hier 25) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 20) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 28) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.
imagettftext($im, 25, $angle1, 20, 28, $shadow, $font, $randomnr);
// Schrijf de Captcha Code op de afbeelding.
// Het eerste getal (hier 20) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 30) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 32) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.
imagettftext($im, 20, $angle2, 30, 32, $front, $font, $randomnr);
// Voorkom dat de afbeelding ge-cached wordt door headers te versturen.
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// Verzend de aangemaakte afbeelding naar de browser.
header ("Content-type: image/gif");
imagegif($im);
imagedestroy($im);
?>
// Start de Session die nodig is om de Captcha code te gebruiken.
session_start();
// Lijst met alle letters en cijfers die gebruikt worden om de Captcha aan te maken.
// Ik heb ervoor gekozen om een aantal letters en cijfers weg te laten aangezien deze veel op elkaar lijken (1, i).
$Characters = '23456789abcdefghjklmnpqrstuvwxyz';
// Aantal tekens dat gebruikt wordt om de Captcha aan te maken.
// Ik heb het aantal ingesteld op 5 , jasper heeft het veranderd naar 7
$chars = 7;
// Stel hieronder de afmetingen voor de Captcha afbeelding in.
// Ik heb gekozen voor 150 pixels breed bij 50 pixels hoog.
$Width = 200;
$Height = 40;
// Maak de Captcha code aan. De code hieronder kiest willekeurig het aantal tekens uit dat is vastgelegd.
// In het geval van dit voorbeeld worden er 5 willekeurige tekens gekozen uit de lijst $Characters
$i = 0;
while ($i < $chars)
{
$randomnr .= substr($Characters, mt_rand(0, strlen($Characters)-1), 1);
$i++;
}
// Schrijf de aangemaakte Captcha code weg in een Session.
// Ik versleutel de code met een md5 hash zodat de code niet zomaar uit de Session te lezen is.
$_SESSION['randomnr2'] = md5($randomnr);
// Start met het aanmaken van de afbeelding.
$im = imagecreatetruecolor($Width, $Height);
// Bepaal de kleuren die je wilt gebruiken. Deze Captcha maakt gebruik van 3 kleuren.
// Kleur 1: $front is de Captcha Code waar het uitenidelijk om draait.
// Kleur 2: $shadow is de schaduw die ik achter de Captcha Code schrijf.
// Kleur 3: $background is de achtergrond kleur van de gehele Captcha afbeelding.
$front = imagecolorallocate($im, 255, 255, 255);
$shadow = imagecolorallocate($im, 128, 128, 255);
$background = imagecolorallocate($im, 6, 51, 125);
// Vul de aangemaakt afbeelding met de hierboven ingestelde achtergrond kleur.
imagefilledrectangle($im, 0, 0, $Width, $Height, $background);
// Stel het True Type Font in dat je wilt gaan gebruiken.
// Zorg ervoor dat je de juiste locatie van je .ttf bestand invult.
// Voor deze Captcha maak ik gebruik van Artbrush.ttf
$font = 'arial.ttf';
// Stel de max. en min. hoek in waarmee je de Captcha weg wilt schrijven. Gebruik hiervoor een getal tussen de 0 en 15.
// Deze hoeken worden hierna willekeurig bepaalt aan de hand van de ingestelde max. en min. waarden.
// $angle1 is de hoek waarin de Schaduw van de Captcha code wordt weergegeven.
// $angle2 is de hoek waarin de Captcha code zelf wordt weergegeven.
$angle1 = rand(-12, 12);
$angle2 = rand(-12, 12);
// Schrijf de Schaduw van de Captcha op de afbeelding.
// Het eerste getal (hier 25) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 20) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 28) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.
imagettftext($im, 25, $angle1, 20, 28, $shadow, $font, $randomnr);
// Schrijf de Captcha Code op de afbeelding.
// Het eerste getal (hier 20) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 30) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 32) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.
imagettftext($im, 20, $angle2, 30, 32, $front, $font, $randomnr);
// Voorkom dat de afbeelding ge-cached wordt door headers te versturen.
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// Verzend de aangemaakte afbeelding naar de browser.
header ("Content-type: image/gif");
imagegif($im);
imagedestroy($im);
?>
iemand een idee wat ik fout doe? ;s
Anders: wat krijg je te zien wat gaat er fout? zet php error report aan
Gewijzigd op 14/07/2010 21:27:58 door Bas IJzelendoorn
Ik zou overigens regel 70 t/m 74 weghalen, daar zie ik het nut namelijk niet van in.
Roel van de Water op 14/07/2010 21:43:01:
Het lijkt erop dat je al tekst heb verstuurd naar de browser (zoals echo of HTML).
Ik zou overigens regel 70 t/m 74 weghalen, daar zie ik het nut namelijk niet van in.
Ik zou overigens regel 70 t/m 74 weghalen, daar zie ik het nut namelijk niet van in.
volgens mij zorgt dat ervoor dat de info niet door bots opgehaald kan worden?
edit: maar je captcha werkt toch al? http://jasperdesmet.bplaced.net/captcha.php
Je hoeft dat script natuurlijk niet te includen op index.php, want het script genereert alleen het plaatje. In index.php hoef je alleen maar naar het plaatje te verwijzen, zodat de browser dat apart ophaalt.
Gewijzigd op 14/07/2010 22:37:22 door Jelmer -
<tr><td><img src="captcha.php"></td>
<td><input class="input" type="text" name="captcha"></td></tr>
<tr>
de fout zit bij het checken of het input veld van de captcha gelijk is aan de captcha wat ik nu op deze manier doe:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['captcha']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
?>
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['captcha']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
?>
de output van de error heb ik er niet bij gezet maar dit is de check en hier loopt het fout.
de error is:
Warning: session_start() [function.session-start]: Cannot send session cache limiter
edit: ik heb even de volledige code er bij gezet dan is het misschien duidelijker:
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
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
<?php
if(!isset($_POST['Submit'])) {
<form name="form1" method="post" action="">
<table border="0">
<h2>Reageer</h2>
<tr>
<td>naam:</td>
<td><input name="naam" type="text" id="naam" size="35"></td>
</tr>
<td>E-mailadres:</td>
<td><input name="email" type="text" id="email" size="35"></td>
</tr>
<tr>
<tr>
<td>bericht:</td>
<td><textarea name="bericht" id="bericht" size="35"></textarea></td>
</tr>
<tr><td><img src="captcha.php"></td>
<td><input class="input" type="text" name="captcha"></td></tr>
<tr>
<td colspan="2"><input type="submit" name="Submit" value="verzenden">
<input type="reset" name="Reset" value="Wissen"></td>
</tr>
</table>
</form>
} else {
$error = array();
if($_POST['email'] == "") {
$error[] = 'Er is geen geldig e-mailadres ingevuld.';
}
if(!check_email($_POST['email'])) {
$error[] = 'Er is geen geldig e-mailadres ingevuld.';
}
if($_POST['naam'] == "") {
$error[] = 'Er is geen naam ingevuld.';
}
if(!preg_match("/^[-_0-9a-z]{2,}$/i", $_POST['naam'])) {
$error[] = 'Een naam mag slechts alfanummerieke tekens bevatten (a-z, 0-9), underscore (_) of liggend streepje (-).';
}
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['captcha']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
$fouten = sizeof($error); // aantal errors tellen
if($fouten != 0) { // Er is minstens 1 error
echo 'Het bericht kon niet worden verzonden omwille van de volgende reden(en):';
echo '<ul>';
for($i = 0; $i < $fouten; $i++) {
echo '<li>'.$error[$i].'</li>';
}
echo '</ul>';
} else {
mysql_query("INSERT INTO reageer_index (naam,email,bericht) VALUES ('".$_POST['naam']."','".($_POST['email'])."','".$_POST['bericht']."')");
}
}
?>
if(!isset($_POST['Submit'])) {
<form name="form1" method="post" action="">
<table border="0">
<h2>Reageer</h2>
<tr>
<td>naam:</td>
<td><input name="naam" type="text" id="naam" size="35"></td>
</tr>
<td>E-mailadres:</td>
<td><input name="email" type="text" id="email" size="35"></td>
</tr>
<tr>
<tr>
<td>bericht:</td>
<td><textarea name="bericht" id="bericht" size="35"></textarea></td>
</tr>
<tr><td><img src="captcha.php"></td>
<td><input class="input" type="text" name="captcha"></td></tr>
<tr>
<td colspan="2"><input type="submit" name="Submit" value="verzenden">
<input type="reset" name="Reset" value="Wissen"></td>
</tr>
</table>
</form>
} else {
$error = array();
if($_POST['email'] == "") {
$error[] = 'Er is geen geldig e-mailadres ingevuld.';
}
if(!check_email($_POST['email'])) {
$error[] = 'Er is geen geldig e-mailadres ingevuld.';
}
if($_POST['naam'] == "") {
$error[] = 'Er is geen naam ingevuld.';
}
if(!preg_match("/^[-_0-9a-z]{2,}$/i", $_POST['naam'])) {
$error[] = 'Een naam mag slechts alfanummerieke tekens bevatten (a-z, 0-9), underscore (_) of liggend streepje (-).';
}
// Start de Session voor de Captcha code
session_start();
// Controleer of de ingevulde Captcha code overeen komt met de Captcha code zoals die weergegeven werd.
// Als de code overeen komt ga door en geef geen Error waarschuwing (0).
if (md5($_POST['captcha']) != $_SESSION['randomnr2']){
$error[] = 'Vul de captcha correct in.';
}
$fouten = sizeof($error); // aantal errors tellen
if($fouten != 0) { // Er is minstens 1 error
echo 'Het bericht kon niet worden verzonden omwille van de volgende reden(en):';
echo '<ul>';
for($i = 0; $i < $fouten; $i++) {
echo '<li>'.$error[$i].'</li>';
}
echo '</ul>';
} else {
mysql_query("INSERT INTO reageer_index (naam,email,bericht) VALUES ('".$_POST['naam']."','".($_POST['email'])."','".$_POST['bericht']."')");
}
}
?>
edit: Het script werkt nu maar er komt nog altijd een foutmelding op door de session(). Als ik de session() dan weghaal werkt het script natuurlijk niet meer dus ik moet zorgen dat de session() kan blijven zonder foutmelding
Gewijzigd op 15/07/2010 13:59:58 door Jasper DS