Captcha
ik heb een captcha op mijn site maar de tekens van de captcha in mijn sessie zijn anders dan die op mijn plaatje. Hoe komt dat? Ligt dat aan de structuur van mijn code?
De code die ik gebruik om te controleren:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
# check captcha
if($_SESSION['captcha'] != $_POST['captcha'])
{
$error[] = 'De captcha is niet correct ingevuld.';
}
?>
# check captcha
if($_SESSION['captcha'] != $_POST['captcha'])
{
$error[] = 'De captcha is niet correct ingevuld.';
}
?>
online voorbeeld -> in het plaatje de captcha, rechts naast het input vakje de session.
Alvast bedankt.
Gewijzigd op 27/02/2011 17:22:55 door Jasper DS
Oftewel laat even de relevante code zien: de code zien waarmee je code in de afbeelding en sessie zet...
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
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
<?php
// Voor de sessie...
session_start();
// Hier stoppen we alle letters en getallen in een string...
$sCode = implode(range('a', 'z'));
$sCode .= implode(range(0, 9));
// De eerste 6 tekens sellecteren van een string die random gemaakt is...
$sCode = substr(str_shuffle($sCode), 0, 6);
// De IMG zelf...
if ($image = imagecreatetruecolor(115, 25))
{
// De achtergrond kleur...
$fontcolor = imagecolorallocate ($image, rand(190, 255), rand(190, 255), rand(190, 255));
// Lusje maken...
for ($i = 0; $i < strlen($sCode); $i++)
{
// Ze zullen om-en-om in een negative of positieve rotatie staan...
$iRotation = ($i % 2 == 0) ? rand(-12, -6) : rand(6, 12);
$iMargin = ($i == 0) ? 14 : $i * 14 + 20;
// We gaan de text in de IMG zetten..
imagettftext($image, 11, $iRotation, $iMargin, rand(12, 22), $fontcolor, 'arial.ttf', $sCode{$i});
}
// De waarde in een sessie zetten...
$_SESSION['captcha'] = $sCode;
// Headertje verzenden...
header('Content-type: image/png');
// De IMG weergeven...
imagepng ($image);
// Het is klaar...
imagedestroy ($image);
}
else
{
// Error weergeven...
echo'Het plaatje kon niet worden aangemaakt.');
}
?>
// Voor de sessie...
session_start();
// Hier stoppen we alle letters en getallen in een string...
$sCode = implode(range('a', 'z'));
$sCode .= implode(range(0, 9));
// De eerste 6 tekens sellecteren van een string die random gemaakt is...
$sCode = substr(str_shuffle($sCode), 0, 6);
// De IMG zelf...
if ($image = imagecreatetruecolor(115, 25))
{
// De achtergrond kleur...
$fontcolor = imagecolorallocate ($image, rand(190, 255), rand(190, 255), rand(190, 255));
// Lusje maken...
for ($i = 0; $i < strlen($sCode); $i++)
{
// Ze zullen om-en-om in een negative of positieve rotatie staan...
$iRotation = ($i % 2 == 0) ? rand(-12, -6) : rand(6, 12);
$iMargin = ($i == 0) ? 14 : $i * 14 + 20;
// We gaan de text in de IMG zetten..
imagettftext($image, 11, $iRotation, $iMargin, rand(12, 22), $fontcolor, 'arial.ttf', $sCode{$i});
}
// De waarde in een sessie zetten...
$_SESSION['captcha'] = $sCode;
// Headertje verzenden...
header('Content-type: image/png');
// De IMG weergeven...
imagepng ($image);
// Het is klaar...
imagedestroy ($image);
}
else
{
// Error weergeven...
echo'Het plaatje kon niet worden aangemaakt.');
}
?>
Gewijzigd op 27/02/2011 17:27:35 door Jasper DS
Zoals je op de site kan zien zijn de codes het zelfde, alleen die sessie loopt 1 code achter.
klopt, hoe pas ik dat aan?
Laat code van je formulier eens zien
Code (php)
1
2
2
<img src="captcha.php" alt="captcha">
<input class="input" type="text" name="captcha" maxlength="7">
<input class="input" type="text" name="captcha" maxlength="7">
Gewijzigd op 27/02/2011 17:41:45 door Jasper DS
Ik heb dus een bestand captcha.php daar word de sessie en de afbeelding gemaakt die ik dan in mijn reactiescript oproep.
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
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
<?php
session_start();
header("Content-type: image/png");
$chars = Array_Merge(range('a', 'z'), range(0, 9));
$_SESSION['string'] = '';
for ($i = 0; $i < 6; $i++) {
$_SESSION['string'] .= $chars[rand(0, count($chars)) - 1];
}
$img = imagecreate(6 * 18, 45);
imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
imageline($img, 0, 0, 0, 44, imagecolorallocate($img, 0, 0, 0));
imageline($img, 0, 0, 6 * 18 - 1, 0, imagecolorallocate($img, 0, 0, 0));
imageline($img, 6 * 18 - 1, 0, 6 * 18 - 1, 45, imagecolorallocate($img, 0, 0, 0));
imageline($img, 0, 44, 6 * 18 - 1, 44, imagecolorallocate($img, 0, 0, 0));
for ($i = 0; $i < 10; $i++) {
imageline($img, rand(2, 6 * 18 - 1), 1, rand(2, 6 * 18 - 1), 44, imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)));
}
for ($i = 0; $i < 6; $i++) {
imagettftext($img, 19, rand(-20, 20), $i * 16 + 6, rand(20, 40), imagecolorallocate($img, 0, 0, 0), 'font.ttf', $_SESSION['string'][$i]);
}
imageline($img, 1, rand(2, 16), 6 * 18 - 1, rand(2, 16), imagecolorallocate($img, rand(0, 245), rand(0, 245), rand(0, 245)));
imageline($img, 1, rand(17, 33), 6 * 18 - 1, rand(17, 33), imagecolorallocate($img, rand(0, 245), rand(0, 245), rand(0, 245)));
imagepng($img);
imagedestroy($img);
?>
session_start();
header("Content-type: image/png");
$chars = Array_Merge(range('a', 'z'), range(0, 9));
$_SESSION['string'] = '';
for ($i = 0; $i < 6; $i++) {
$_SESSION['string'] .= $chars[rand(0, count($chars)) - 1];
}
$img = imagecreate(6 * 18, 45);
imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
imageline($img, 0, 0, 0, 44, imagecolorallocate($img, 0, 0, 0));
imageline($img, 0, 0, 6 * 18 - 1, 0, imagecolorallocate($img, 0, 0, 0));
imageline($img, 6 * 18 - 1, 0, 6 * 18 - 1, 45, imagecolorallocate($img, 0, 0, 0));
imageline($img, 0, 44, 6 * 18 - 1, 44, imagecolorallocate($img, 0, 0, 0));
for ($i = 0; $i < 10; $i++) {
imageline($img, rand(2, 6 * 18 - 1), 1, rand(2, 6 * 18 - 1), 44, imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)));
}
for ($i = 0; $i < 6; $i++) {
imagettftext($img, 19, rand(-20, 20), $i * 16 + 6, rand(20, 40), imagecolorallocate($img, 0, 0, 0), 'font.ttf', $_SESSION['string'][$i]);
}
imageline($img, 1, rand(2, 16), 6 * 18 - 1, rand(2, 16), imagecolorallocate($img, rand(0, 245), rand(0, 245), rand(0, 245)));
imageline($img, 1, rand(17, 33), 6 * 18 - 1, rand(17, 33), imagecolorallocate($img, rand(0, 245), rand(0, 245), rand(0, 245)));
imagepng($img);
imagedestroy($img);
?>
:-)
Volgens mij is dit wat er gebeurt:
1) er wordt door het script een captcha code aangemaakt (die noemen we even "code A")
2) er wordt een plaatje gegenereerd dat onderaan het formulier wordt getoond
3) de gebruiker vult de code in in het invoerveld en drukt op de verzendknop
4) DE PAGINA WORDT OPNIEUW AANGEROEPEN en de post waardes worden meegestuurd
5) er wordt nu opnieuw een captcha code aangemaakt (die noemen we even "code B")
6) de door de gebruiker ingevoerde captcha code wordt vergeleken met de zojuist aangemaakte "code B"
Je vergelijkt dus de door de gebruiker ingevoerde code met een zojuist nieuw gegenereerde code. Ik denk dat je dit simpelweg kunt voorkomen door een if-statement te bouwen om de php-code die de captcha code genereert, dus zoiets:
Gewijzigd op 02/03/2011 01:49:01 door Ozzie PHP
------------
(aanpassing)
Wat is het probleem eigenlijk?
Bij mij werkt dit perfect.
Een illustratie:
index.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo '$_SESSION["captcha"]: '. $_SESSION["captcha"] .'<br/>';
echo '$_POST["captcha"]: '. $_POST["captcha"] .'<br/>';
}
echo '
<form action="" method="post">
<input class="input" type="text" name="captcha" maxlength="7">
<input type="submit" value="GO!"/>
<br/>
<img src="captcha.php" alt="captcha"> <br/>
</form>
';
?>
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo '$_SESSION["captcha"]: '. $_SESSION["captcha"] .'<br/>';
echo '$_POST["captcha"]: '. $_POST["captcha"] .'<br/>';
}
echo '
<form action="" method="post">
<input class="input" type="text" name="captcha" maxlength="7">
<input type="submit" value="GO!"/>
<br/>
<img src="captcha.php" alt="captcha"> <br/>
</form>
';
?>
captcha.php: onveranderd (juist de parse error weggehaald)
(Edit: Leuke captcha afbeelding. Ik zou dit ook wel durven gebruiken)
Gewijzigd op 02/03/2011 16:24:00 door Kris Peeters
krijgen we nog te horen of het is gelukt?
Ja momentje, ik zal vanavond kijken of het is gelukt.