$_SESSION loopt achter
De session bevat de code die in het plaatje staat, als ik met De inhoud van $_SESSION['code'] in het plaatje zet om te kijken of er uberhaubt iets in de session staat en of de goede code in de session staat werkt het. Maar als ik in een ander bestand het plaatje zet met
<img src="captcha.php">
Dan is alles wat ik invul fout.
Als ik in een ander bestand waar het plaatje staat de session weergeef dmv
Dan staat de vorige code erin, dus de code van het plaatje ervoor.
Als ik dus in het formulier de code typ die in het plaatje te zien is, is het fout
Als ik de code typ van het vorige plaatje is het ook fout! terwijl deze wel in de session staat, dat zie je omdat ik de $_SESSION['code'] heb ge'echod
Het is dus altijd fout... Ik heb al vanalles geprobeerd.
Hier zijn de bestanden:
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
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
<?PHP
session_start();
// Instellingen //
$breedte = 150; // Breedte van het plaatje
$hoogte = 50; // Hoogte van het plaatje
$length = 6; // Aantal tekens die moeten worden over getypt
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Mogelijke tekens die voor komen
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is uit
$cirkels = 'ja'; // Cirkels tekenen: ja is aan, nee is uit
// Einde van de instellingen //
$image = ImageCreate($breedte, $hoogte); //Plaatje aanmaken met X=300 en Y=75
$achtergrond = ImageColorAllocate($image, 255, 255, 256); //255, 255, 255 = Wit
$lijnkleur = imagecolorallocate($image, 255, 000, 000);
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
$white = imagecolorallocate($image, 255, 255, 255);
$textcolor = imagecolorallocate($image, 000, 000, 000);
$left = 0;
for($i=1;$i<=$length;$i++){
$left = $left + rand(12, 18);
$top = rand(0, 30);
if(rand(0, 1) == '1') {
imagefilledellipse($image, $left, $top, 10, 10, $white); // Een cirkel als achtergrond van de letters
}
$letter = $characters[mt_rand(0, strlen($characters))];
imageString($image, 5, $left, $top, $letter, $textcolor);
$session = $session.''.$letter;
}
$_SESSION['code'] = $session; // De code wordt opgeslagen in een session
header("content-type: image/png");
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");
ImagePng($image);
ImageDestroy($image);
?>
session_start();
// Instellingen //
$breedte = 150; // Breedte van het plaatje
$hoogte = 50; // Hoogte van het plaatje
$length = 6; // Aantal tekens die moeten worden over getypt
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Mogelijke tekens die voor komen
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is uit
$cirkels = 'ja'; // Cirkels tekenen: ja is aan, nee is uit
// Einde van de instellingen //
$image = ImageCreate($breedte, $hoogte); //Plaatje aanmaken met X=300 en Y=75
$achtergrond = ImageColorAllocate($image, 255, 255, 256); //255, 255, 255 = Wit
$lijnkleur = imagecolorallocate($image, 255, 000, 000);
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
$white = imagecolorallocate($image, 255, 255, 255);
$textcolor = imagecolorallocate($image, 000, 000, 000);
$left = 0;
for($i=1;$i<=$length;$i++){
$left = $left + rand(12, 18);
$top = rand(0, 30);
if(rand(0, 1) == '1') {
imagefilledellipse($image, $left, $top, 10, 10, $white); // Een cirkel als achtergrond van de letters
}
$letter = $characters[mt_rand(0, strlen($characters))];
imageString($image, 5, $left, $top, $letter, $textcolor);
$session = $session.''.$letter;
}
$_SESSION['code'] = $session; // De code wordt opgeslagen in een session
header("content-type: image/png");
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");
ImagePng($image);
ImageDestroy($image);
?>
form.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
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
session_start();
echo $_SESSION['code']; // om te testen wat er in de session staat
$tekens = $_POST['tekens'];
$code = $_SESSION['code'];
if(isset($_POST['ok'])) {
if($tekens == $code) {
echo 'De ingevulde code is juist';
} else {
echo 'De ingevulde code in niet juist';
}
}
?>
<html>
<head>
</head>
<body>
<form method="post" action="">
<img src="captcha.php">
<input type="text" name="tekens">
<input type="submit" name="ok" value="OK">
</form>
</body>
</html>
session_start();
echo $_SESSION['code']; // om te testen wat er in de session staat
$tekens = $_POST['tekens'];
$code = $_SESSION['code'];
if(isset($_POST['ok'])) {
if($tekens == $code) {
echo 'De ingevulde code is juist';
} else {
echo 'De ingevulde code in niet juist';
}
}
?>
<html>
<head>
</head>
<body>
<form method="post" action="">
<img src="captcha.php">
<input type="text" name="tekens">
<input type="submit" name="ok" value="OK">
</form>
</body>
</html>
Ik heb deze scripts helemaal zelf gemaakt
Overigens is dat geen correcte manier om te controleren of een formulier is verzonden. Gebruik liever: if($_SERVER['REQUEST_METHOD'] == 'POST')
(1e contact met de server: formulier wordt gegenereerd) Op het moment dat de gebruiker het formulier krijgt, is er nog niets van session.
(2e contact met de server: de captcha image wordt gegenereerd) De <img/> laadt dan captcha.php. Op dit moment wordt de captcha die getoond wordt, opgeslagen in een session variabele; terwijl dus de image wordt gegenereerd.
Als de grbruiker dan op submit klikt...
(3e contact met de server: afhandelen post request) op dit moment staat de session, die via de captcha is opgeslagen, op zijn plaats.
Hier kan je dus controleren of
$_POST['tekens'] == $_SESSION['code']
Dit geeft dus inderdaad het gevoel dat de session 1 stap achter komt, maar het is precies wat je wil.
Klinkt zinnig?
(ik zal eens je code testen)
--------------
Update:
Je code werkt hoor.
Er zitten wel een paar notice's die je moet weghalen.
Pas eens aan in jouw code
* captcha.php lijn 62:
$letter = $characters[mt_rand(0, strlen($characters) - 1)]; // letter 36 bestaat niet
* zet ergens bovenaan
$session = ''; // op lijn 64 voeg je karakters toe. Best eerst initialiseren.
* form.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?PHP
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST') { // niet controleren op de submit knop. Gewoon controleren of het request POST is.
if($_POST['tekens'] == $_SESSION['code']) {
echo 'De ingevulde code is juist';
}
else {
echo 'De ingevulde code in niet juist';
}
}
?>
<html>
<head>
</head>
<body>
<form method="post" action="">
<img src="captcha.php">
<input type="text" name="tekens">
<input type="submit" name="ok" value="OK">
</form>
</body>
</html>
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST') { // niet controleren op de submit knop. Gewoon controleren of het request POST is.
if($_POST['tekens'] == $_SESSION['code']) {
echo 'De ingevulde code is juist';
}
else {
echo 'De ingevulde code in niet juist';
}
}
?>
<html>
<head>
</head>
<body>
<form method="post" action="">
<img src="captcha.php">
<input type="text" name="tekens">
<input type="submit" name="ok" value="OK">
</form>
</body>
</html>
Gewijzigd op 24/02/2012 16:42:35 door Kris Peeters
Het volgende viel me op , ook viel het me op hoe je keek of een form verzonden is maar dit heeft obelix je al verteld.
Code (php)
Word dan zo iets.
Code (php)
Dit omdat je niet onnodig variabelen moet gaan kopieren.
Ook zou ik als ik jou was hier even naar kijken want ik zelf vind je variabele beetje onduidelijk maar dit maakt natuurlijk niet. Maar dit kan je ook op een andere manier oplossen :)
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
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
<?
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
?>
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
?>
De code hierboven kun je makkelijker aanpassen door.
Code (php)
1
2
3
4
5
2
3
4
5
<?
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is
?>
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is
?>
te vervangen door iets van
Als je dat doet kun je van de code die ik net gaf dus dat
Vervangen voor een switch dus:
Code (php)
Toevoeging op 24/02/2012 18:56:44:
Bas van de S op 24/02/2012 16:32:32:
Ik heb het druk dus heb je code even snel door gelezen.
Het volgende viel me op , ook viel het me op hoe je keek of een form verzonden is maar dit heeft obelix je al verteld.
Word dan zo iets.
Dit omdat je niet onnodig variabelen moet gaan kopieren.
Ook zou ik als ik jou was hier even naar kijken want ik zelf vind je variabele beetje onduidelijk maar dit maakt natuurlijk niet. Maar dit kan je ook op een andere manier oplossen :)
De code hierboven kun je makkelijker aanpassen door.
te vervangen door iets van
Als je dat doet kun je van de code die ik net gaf dus dat
Vervangen voor een switch dus:
Het volgende viel me op , ook viel het me op hoe je keek of een form verzonden is maar dit heeft obelix je al verteld.
Code (php)
Word dan zo iets.
Code (php)
Dit omdat je niet onnodig variabelen moet gaan kopieren.
Ook zou ik als ik jou was hier even naar kijken want ik zelf vind je variabele beetje onduidelijk maar dit maakt natuurlijk niet. Maar dit kan je ook op een andere manier oplossen :)
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
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
<?
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
?>
if($strepen1 == 'ja') {
$aantallijn = 10;
for($i=1;$i<=$aantallijn;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen2 == 'ja') {
$aantallijn1 = 10;
for($i=1;$i<=$aantallijn1;$i++){
ImageLine($image, 0, mt_rand(0, $hoogte), mt_rand(0, $breedte), $hoogte, $lijnkleur);
}
}
if($strepen3 == 'ja') {
$aantallijn2 = 10;
for($i=1;$i<=$aantallijn2;$i++){
ImageLine($image, $breedte, mt_rand(0, $hoogte), 0, mt_rand(0, $hoogte), $lijnkleur);
}
}
if($cirkels == 'ja') {
$randomcolor = imagecolorallocate($image, 255, 230, 255);
$widthHeight = mt_rand(10, 100);
$aantalcirkel = 10;
for($i=1;$i<=$aantalcirkel;$i++){
imageellipse($image, mt_rand(0, $breedte), mt_rand(0, $hoogte), $widthHeight, $widthHeight, $randomcolor);
}
}
?>
De code hierboven kun je makkelijker aanpassen door.
Code (php)
1
2
3
4
5
2
3
4
5
<?
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is
?>
$strepen1 = 'ja'; // Lijnen tekenen: ja is aan, nee is uit
$strepen2 = 'ja'; // Nog meer lijnen: ja is aan, nee is uit
$strepen3 = 'ja'; // Nog veel meer lijnen: ja is aan, nee is
?>
te vervangen door iets van
Als je dat doet kun je van de code die ik net gaf dus dat
Vervangen voor een switch dus:
Gewijzigd op 24/02/2012 16:38:40 door Bas van de Steeg