[PHP] Formulier-vergelijkingen gaan mis

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ik ben het volgende van plan met een formulier:

1. Code in een sessie gooien
2. Toon captcha'ed code in formulier
3. Als er sprake is van een POST request controleren of hetgeen de gebruiker ingevoerd heeft overeen komt met dat wat in de sessie staat

Als het wél overeen komt: rest van het formulier afhandelen

Als het niet overeen komt: nieuwe captcha code tonen

En dan begint het weer van voor af aan zegmaar.

Ik heb nu deze (voor GoT versimpelde) 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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {          
    extract($_POST);
    /*
    Check of captcha code correct is ingevuld
    */
    if(strtolower(trim($frmCaptcha)) == strtolower(trim($_SESSION['captcha_code']))) {
        echo "oke";
    } else {
        /*
        Captcha code komt niet overeen.
        */
        $_SESSION['captcha_code'] = genRandomCode(); //Sla de captcha code op in de sessie.
        
        $smarty->assign("wrongCode",1); //Toon foutmelding
        $smarty->assign("template","links/add.tpl");
        $smarty->display("index.tpl");
    }
} else {
    /*
    Toon formulier waar gebruiker link mee kan toevoegen
    */
    $_SESSION['captcha_code'] = genRandomCode(); //Sla de captcha code op in de sessie.

    $smarty->assign("template","links/add.tpl");
    $smarty->display("index.tpl");
}
?>


In feite zou 'ie met deze code moeten kunnen werken. Dat blijkt alleen niet zo te zijn. Ergens gaat iets fout met de vergelijking, de waarde in de sessie komt dus niet overeen met de waarde die een gebruiker gepost heeft. Ik ben al enige tijd bezig met het oplossen hiervan, en zelfs met de versimpelde versie krijg ik het niet aan de praat.

De captcha is trouwens niets anders dan een afbeelding waar de inhoud van captcha_code in staat.

Hoe krijg ik dit in hemelnaam werkend ?

Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 16-09 17:40

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Er staat me iets van bij dat je Strings niet met == kan vergelijken in PHP? Volgens mij moet je daar strcmp voor gebruiken of iets dergelijks?

Edit: hmm, was toch niet helemaal zoals ik dacht inderdaad. Meer info: http://www.brainbell.com/tutorials/php/Comparing_Strings.htm

[ Voor 62% gewijzigd door Orion84 op 12-03-2008 14:33 ]

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Orion84 schreef op woensdag 12 maart 2008 @ 14:23:
Er staat me iets van bij dat je Strings niet met == kan vergelijken in PHP? Volgens mij moet je daar strcmp voor gebruiken of iets dergelijks?
Dit werkt prima;

PHP:
1
2
3
4
5
6
7
8
<?php
(string)$foo = "hoi";
(string)$bar = "hoi";

if ($foo == $bar) {
    print "ok";
}
?>


Dus daar lijkt me het probleem niet in te zitten.

Acties:
  • 0 Henk 'm!

  • t-x-m
  • Registratie: November 2003
  • Laatst online: 24-08 11:21

t-x-m

.NET Nerd

Als je de waarden die je nu vergelijkt: strtolower(trim($frmCaptcha)) en strtolower(trim($_SESSION['captcha_code'])) print(), zijn de waarden dan wel identiek?

GC.Collect();


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

mcdronkz schreef op woensdag 12 maart 2008 @ 14:26:
[...]


Dit werkt prima;

PHP:
1
2
3
4
5
6
7
8
<?php
(string)$foo = "hoi";
(string)$bar = "hoi";

if ($foo == $bar) {
    print "ok";
}
?>


Dus daar lijkt me het probleem niet in te zitten.
dat casten kan je net zo goed laten, dat werkt voor geen meter. (eigenlijk alleen om simpleXML objecten weer terug te casten naar string 8)7
De juiste manier om iets exact te vergelijk en is de === operator.

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Komt de inhoud van het plaatje wel overheen met de waarde in de sessie?

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
SchizoDuckie schreef op woensdag 12 maart 2008 @ 14:29:
[...]
dat casten kan je net zo goed laten
In 't algemeen: Casten kan wel nuttig zijn, maar dan moet je het natuurlijk wel rechts van de assignment operator doen. :P

{signature}


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Geen antwoord op je vraag, maar ik zou oppassen met extract($_POST);
Iemand kan namelijk een formulier lokaal maken, met andere _POST variabelen, die vervolgens je eigen eerder gesette waarden overschrijven.

Dus alleen per var die je zeker nodig hebt:
$var=$_POST['var'];

En evt nog escapen als je het resultaat in queries gaat gebruiken.

Wat betreft je vraag:
- Doe eens een print_r($_POST) en check de waarde van frmCaptcha
- Echo gewoon eens _session['captcha_code'] en vergelijk met _POST
- Doe je wel session_start()

Oftwel, klopt je form en je _session wel?

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Het lijkt soms echt volgens volledige willekeur te werken, ik kan er niet echt een patroon in ontdekken.

Ik draai nu de volgende code op m'n server (nog meer versimpeld):

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
<?php
/*
Toon POST en SESSION waarden
*/
print "<pre style='color: white;'>";
print "<h3>POST:</h3>";
print_r($_POST);
print "<hr />";
print "<h3>SESSION:</h3>";
print_r($_SESSION);
print "</pre><hr />";

if($_SERVER['REQUEST_METHOD'] == "POST") {
    /*
    Controleer of captcha waarde uit sessie hetzelfde is met die uit het POST request
    */
    if(trim(strtolower($_POST['frmCaptcha'])) == trim($_SESSION['captcha_code'])) {
        echo "prima";
    } else {
        echo "waarde klopt niet";
    }
} else {
    /*
    Geen POST request, formulier tonen met captcha
    */
    $_SESSION['captcha_code'] = genRandomCode(); //Sla de captcha code op in de sessie.`
    
    /*
    Toon waarde na het genereren van de captcha code:
    */
    print "<h3 style='color:white';>Waarde na genereren<br /> random code: ".$_SESSION['captcha_code']."</h3>";
    
    $smarty->assign("template","links/add.tpl");
    $smarty->display("index.tpl");
}
?>


Daarmee kan iedereen dus op deze pagina kijken wat er gebeurt.

Ik zit in m'n hoofd die code steeds weer af te spelen, maar ik kan echt niet ontdekken wat hier niet aan klopt. Gaat er iets fout met sessies ? Gaat er iets fout met het checken ? Gaat er iets fout met het genereren van de code ? Ik weet het niet meer.

- edit -

Even wat meer, stel ik zie als captcha "ere", dan voer ik dat in en druk ik op OK, dan zie ik eerst dit:

POST:
Array
(
[frmCaptcha] => ere
)

en dan zie ik dit:

SESSION:
Array
(
[captcha_code] => gta
)

En dat komt dus niet overeen, en dat zou wel moeten.

Dus als ik op OK druk wordt de sessie kennelijk ergens aangepast, maar hoe dat kan, ik doe dat volgens mij nergens hoor 8)7

[ Voor 12% gewijzigd door mcdronkz op 12-03-2008 19:40 ]


Acties:
  • 0 Henk 'm!

  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 26-08 00:13
Zet je de waarden wel direct op het zelfde moment in de variabelen? Of declareer je ze direct van elkaar af?
Als je eerst de sessievar declareerd en daarna pas je plaatje (of text) dan zijn de waardes natuurlijk anders als je gebruik maakt van een random string.

Of toon je de random code in je pagina direct vanuit je sessie? Dan zou het gelijk moeten zijn.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PseudoCode:
Declaratie:
$_SESSION[captcha] = random();

Tonen code
$captcha = $_SESSION[captcha];

Vergelijken code
if($captcha != $_SESSION[captcha])
{
     //gaat wat mis declareer opnieuw
     $_SESSION[captcha] = random();  
}else{
     //oke, doe iets...
}

Een echte golver is nooit uitgeput


Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Orion84 schreef op woensdag 12 maart 2008 @ 14:23:
Er staat me iets van bij dat je Strings niet met == kan vergelijken in PHP? Volgens mij moet je daar strcmp voor gebruiken of iets dergelijks?

Edit: hmm, was toch niet helemaal zoals ik dacht inderdaad. Meer info: http://www.brainbell.com/tutorials/php/Comparing_Strings.htm
Dat is Java :)

Bij C# kan het dan weer wel omdat de == overloaded is, met de .equals.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • mr_derk
  • Registratie: September 2005
  • Laatst online: 21:53
Snake schreef op woensdag 12 maart 2008 @ 21:58:
[...]

Dat is Java :)

Bij C# kan het dan weer wel omdat de == overloaded is, met de .equals.
idd, de beruchte stringpool

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
LoBbY_1 schreef op woensdag 12 maart 2008 @ 21:48:
Zet je de waarden wel direct op het zelfde moment in de variabelen? Of declareer je ze direct van elkaar af?
Als je eerst de sessievar declareerd en daarna pas je plaatje (of text) dan zijn de waardes natuurlijk anders als je gebruik maakt van een random string.

Of toon je de random code in je pagina direct vanuit je sessie? Dan zou het gelijk moeten zijn.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PseudoCode:
Declaratie:
$_SESSION[captcha] = random();

Tonen code
$captcha = $_SESSION[captcha];

Vergelijken code
if($captcha != $_SESSION[captcha])
{
     //gaat wat mis declareer opnieuw
     $_SESSION[captcha] = random();  
}else{
     //oke, doe iets...
}
Dit is in feite het enige wat er gebeurt bij het tonen van de random code op de site:

PHP:
1
imagettftext($im, 20, 0, 10, 20, $green, $font, $_SESSION['captcha_code']);


Ik laad 'm dus gewoon uit de sessie, dat mag volgens mij niks uitmaken.

- edit -

Damn, ik zie nu dus iets heel raars. Soms zie je bij "Waarde na genereren random code: ..." iets anders staan als bij het plaatje. Als je dan de code invoert krijg je "prima" terug. Dit heb ik meestal als ik de page zo'n 5 keer ga refreshen.

Probeer 't maar eens.

Kan _iemand_ dit verklaren ?

[ Voor 13% gewijzigd door mcdronkz op 12-03-2008 23:27 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:29

crisp

Devver

Pixelated

Hier is de boosdoener:
HTML:
1
<img id="imgBoxImage" src="" alt="" style="padding-bottom: 5px"/>

;)

En verder: sla je die captcha op op je filesystem? Ik voorzie daar wel wat concurrency-problemen...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
De afbeelding zelf wordt niet opgeslagen, maar met imagejpeg(..) op het scherm getoont als de gebruiker daarom "vraagt".

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:29

crisp

Devver

Pixelated

mcdronkz schreef op woensdag 12 maart 2008 @ 23:32:
De afbeelding zelf wordt niet opgeslagen, maar met imagejpeg(..) op het scherm getoont als de gebruiker daarom "vraagt".
Ah, ok. Ik vroeg het me af omdat je wel linkt naar een captcha.jpg, maar dat is dus eigenlijk een script?

Maar anyway, ik heb je de oorzaak al aangewezen. Check maar eens je HTTP requests, er wordt 2x een request gedaan naar http://www.projectsource.nl/sites/mcdronkz/?p=links - die tweede request komt van het lege src-attribuut in die img-tag :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Die captcha is een script ja, gebruik een RewriteRule om ?p=captcha om te zetten naar captcha.jpg ;).

Maar gast, volgens mij heb je gelijk ! Je zei het al, maar het kwartje valt nu pas. Wow, dat had ik zelf echt nooit bedacht.

Thanks !

Acties:
  • 0 Henk 'm!

  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 26-08 00:13
Als het een script is weet je webserver dan wel dat hij op dat bestand op die extentie niet mag cashen? Ik heb ooit eens met het zelfde probleem gezeten. Scripts worden nooit gecashed, Maar als je webserver dit niet ziet als een script wordt er dan geen 304 verstuurd?


(Edit: oke, zie niet je antwoord hierboven!)

[ Voor 8% gewijzigd door LoBbY_1 op 12-03-2008 23:48 ]

Een echte golver is nooit uitgeput


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:29

crisp

Devver

Pixelated

HTTP sniffers FTW ;)

Ik heb dit soort problemen meer gezien, ook bijvoorbeeld met custom 404-scripts die 'per ongeluk' weer dingen met een sessie deden. Ik zet dan altijd meteen mijn 'Live HTTP Headers' extensie even aan :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Jep, ik zag het nu ook ja.

Gelukkig lag het probleem niet bij m'n PHP code, anders had ik op de één of andere manier geen lekker gevoel gehad als het uiteindelijk daarmee werkend gemaakt kon worden.

Nu nog effe die lege tag oplossen, maar dat komt later wel.

Acties:
  • 0 Henk 'm!

  • $tranger
  • Registratie: Januari 2000
  • Laatst online: 03-07 18:31
crisp schreef op woensdag 12 maart 2008 @ 23:29:
Hier is de boosdoener:
HTML:
1
<img id="imgBoxImage" src="" alt="" style="padding-bottom: 5px"/>

;)

En verder: sla je die captcha op op je filesystem? Ik voorzie daar wel wat concurrency-problemen...
Wat, gebruik je de imgBox, prutser :+

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
$tranger schreef op donderdag 13 maart 2008 @ 00:04:
[...]
Wat, gebruik je de imgBox, prutser :+
Wat zei je, Jordi ;) ?
Pagina: 1