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