/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
mærkeligt problem med sessions og cap
Fra : Martin Larsen


Dato : 19-08-06 10:35

Hej NG

Jeg har rodet længe med et mærkeligt sessionsproblem i forbindelse med
captcha (sikkerhedsbilleder til spambeskyttelse af formularer).

Hovedscriptet har en kontaktformular som brugeren kan udfylde. For at
undgå spam skal der indtaste nogle "forvrængede" bogstaver.

Disse bogstaver dannes af et andet script i form af et png-billede.
Scriptet gemmer det dannede ord i en sessionsvariabel, således at
hovedscriptet kan sammenligne det indtastede ord med sikkerhedsordet.

Formen i hovedscriptet ser sådan ud (simplificeret):

<form method="post">
Indtast venligst disse sikkerhedsbogstaver:<br>
<img src="freecap.php"><br>
<input name="captcha" type="text"><br>
<input type="submit" value="ok">
</form>

Inde i freecap.php, som kaldes indirekte via <img>, sættes
sessionsvariablen 'captcha' med det ord der sendes tilbage som en png.

Når formen sendes afsted, sker captcha-tjekket således:

session_start();
if($_POST['captcha']==$_SESSION['captcha'])
echo "Du har tastet rigtigt";
else
echo "Du har tastet forkert, prøv venligst igen";
// Der dannes en ny captcha som brugeren kan prøve med


Sådan set skulle der ikke være nogen ben i det. Der er da heller ikke på
min lokale pc. Men på webhotellet fungerer det ikke!

Sessionsvariablen bliver sat korrekt første gang. Men hvis man så taster
forkert, kaldes freecap.php en gang til, så der sendes et nyt billede
tilbage til browseren. Samtidig opdateres sessionsvariablen med det nye ord.

Men i hovedscriptet indeholder sessionsvariablen stadig den gamle værdi.
Hvis man prøver nogle gange, måske 4-5, opdateres variablen pludselig,
men fastholder så sin værdi igen.

Nu kommer så det mærkelige: Hvis jeg i stedet for at opdatere formen
åbner captcha-billedet alene (via højreklik -> vis billede) så opdateres
sessionsvariablen korrekt.

Det er altså som om sessinshåndteringen er anderledes/upålidelig når det
sker indirekte via et billede.

Desuden er problemet værre i FF end i IE, hvor det optræder sjældnere.

Er der nogen som har et bud? Jeg kommer gerne med flere detaljer hvis
det hjælper!

Takker og bukker

Martin

 
 
Martin Larsen (20-08-2006)
Kommentar
Fra : Martin Larsen


Dato : 20-08-06 00:29

Er der slet ingen som kan belyse dette???

Ukendt (20-08-2006)
Kommentar
Fra : Ukendt


Dato : 20-08-06 15:02

Martin Larsen wrote:
> Inde i freecap.php, som kaldes indirekte via <img>, sættes
> sessionsvariablen 'captcha' med det ord der sendes tilbage som en png.
>
> Når formen sendes afsted, sker captcha-tjekket således:
>
> session_start();
> if($_POST['captcha']==$_SESSION['captcha'])
> echo "Du har tastet rigtigt";
> else
> echo "Du har tastet forkert, prøv venligst igen";
> // Der dannes en ny captcha som brugeren kan prøve med
>
> Sessionsvariablen bliver sat korrekt første gang. Men hvis man så taster
> forkert, kaldes freecap.php en gang til, så der sendes et nyt billede
> tilbage til browseren. Samtidig opdateres sessionsvariablen med det nye
> ord.
>
> Men i hovedscriptet indeholder sessionsvariablen stadig den gamle værdi.
> Hvis man prøver nogle gange, måske 4-5, opdateres variablen pludselig,
> men fastholder så sin værdi igen.
>
> Det er altså som om sessinshåndteringen er anderledes/upålidelig når det
> sker indirekte via et billede.
>
> Er der nogen som har et bud? Jeg kommer gerne med flere detaljer hvis
> det hjælper!

Du kan prøve at unset'te session-cookien i "hovedscriptet"

Martin Larsen (20-08-2006)
Kommentar
Fra : Martin Larsen


Dato : 20-08-06 16:24

at(nospam) wrote:

> Du kan prøve at unset'te session-cookien i "hovedscriptet"

Det virker desværre ikke. Men jeg er kommet lidt videre. Det ser ud til
at problemet opstår fordi der er to sessions igang.

Hovedscriptet genererer html-formen og sikkerhedsbilledet. Inden det
script er helt færdigt, sendes en request til serveren vedr. billedet.
Her startes så en ny session, og det er tilsyneladende her det går galt.

Hvis jeg åbner billedet alene i et nyt vindue og opdaterer, så virker
sessionsvariablerne helt korrekt - men så kører der jo også kun én request!

En lidt ubehændig workaround har været at indsætte en sleep(1) lige før
session_start() , men det vel ikke være rigtigt at php ikke kan håndtere
flere samtidige sessions?

Martin

Dan Storm (20-08-2006)
Kommentar
Fra : Dan Storm


Dato : 20-08-06 19:44

Martin Larsen skrev:
> En lidt ubehændig workaround har været at indsætte en sleep(1) lige før
> session_start() , men det vel ikke være rigtigt at php ikke kan håndtere
> flere samtidige sessions?

Umiddelbart lyder det også lidt mærkeligt.
Må vi se scriptet der opretter din session? (freecap.php)

--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Martin Larsen (20-08-2006)
Kommentar
Fra : Martin Larsen


Dato : 20-08-06 20:51

Dan Storm wrote:

> Umiddelbart lyder det også lidt mærkeligt.
> Må vi se scriptet der opretter din session? (freecap.php)

Det er Freecap (GPL):
http://www.puremango.co.uk/cm_php_captcha_script_113.php

Du kan se koden direkte her:
http://www.kreacom.dk/files/freecap.php.txt

Hilsen
Martin

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste