ugrás a tartalomhoz

SESSION + COOKIE ellenőrzése

PredMan · 2008. Május. 30. (P), 10.59
Sziasztok!

van egy olyan űrlap, amit csak egy kód beírása után tud a felhasználó kitölteni. Ezt session segítségével oldottam meg úgy, hogy ha helyes kódot ír be a felhasználó, akkor a $_SESSION['nospam'] = "clear"; és a következő oldalra csak akkor engedem, ha "clear" a session tartalma.

A gond ott kezdődött, hogy a session érvényessége 20 perc után lejár, így ha az űrlapot sokáig töltik, akkor visszadobja a kódbeíró részhez. Ezt megoldottam cookie-val így:

session_start();

setcookie(session_name("nospam"), session_id(), time()+3600, "/", "", 0);
a probléma az, hogy ugye a cookie törölhető ill. tíltható is a böngészőben.

Azt szeretném megcsinálni, hogy ha a böngészőben tíltva van a cookie, akkor feldobok egy alert() ablakot amiben közlöm a felhasználóval, hogy ha nem engedélyezi a sütiket, akkor max 20 perce van az űrlap kitöltésére.
Hogyan tudnám ezt megoldani? le lehet ezt kérni a böngészőből egyáltalán?

-----

gondoltam egy olyan megoldásra is, hogy elhelyezek az oldalon egy rejtett iframe-et, amelynek a tartalmát mondjuk 5 percenként frissítem. A tartalom egy php fájl, aminek mindössze egy session_start() a tartalma, így gyakorlatilag 5 percenként újrafrissítem a session-ök tartalmát és cookie-ra se lenne szükség. Kérdés, hogy ez mennyire szép megoldás...


előre is köszönöm a válaszokat!
 
1

ajax ping

vbence · 2008. Május. 30. (P), 11.45
XMLHTTP-vel is megpingelhetnéd a szervert 5 percenként (azaz lekéred azt a bizonyos seoion_start-os php fájlt). Vagy mégjobb: egy image url-jeként is meghívhatod a fájlt (ugyebár nem érdekel, hogy mi jön vissza, csak az, hogy meg legyen hívva). Ilyenkor csak arra kell vigyázni, hogy a böngésző ne cache-elje a képet, hanem újra is újra ténylegesen lekérje. Ezt a legegyszerűbben úgy éred el, ha az url végére állandóan változó query-stringet írsz pl:

document.getElemntById("pingimage").src = "ping.php?" + new Date().getTime();
Ez ugybár ilyen url-eket eredményez, mint:
ping.php?1212140670798
ping.php?1212140672972
... és így tovább (téged csak az érdekel, hogy ne legyen ismétlődés)
2

header-el is lehet

Thom · 2008. Május. 30. (P), 13.04
Vagy lehet a lekért képet generáló php fájlba is beletenni header mezőket a böngésző cache tiltására, pl így:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".GmDate( "D, d M Y H:i:s" )." GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/gif");
Az utolsó header mező úgyis kelleni fog, ha egy php fájlt képként küldesz ki.
A két módszer nem zárja ki egymást, de az itt ajánlotthoz kliens js sem kell.
4

puff

PredMan · 2008. Május. 30. (P), 14.09
ajaxhoz sajna nem nagyon értek, azért is próbálom ilyen fapados módszerekkel ezt a problémát kiküszöbölni.
ez a pingelés... ha kapok ilyen urleket, az miért is jó nekem? nem teljesen tiszta ez a megközelítés...

akkor ezekszerint nem lehet lekérdezni böngészőből, hogy a cookie tíltva van-e? csak mert erre nem válaszoltatok :D akkor szerintetek az iframe-es megoldás se jó?

azt még elfelejtettem leírni, hogy az ini_set() függvény is tíltva van a szerveren, pedig azzal lenne a legegyszerűbb megoldani.
7

azért kell pingelés...

Thom · 2008. Május. 30. (P), 15.34
ez a pingelés... ha kapok ilyen urleket, az miért is jó nekem?

Csak azért, mert akkor 5 percenként lefuthat a szerveren egy kódod, ami frissíti a klienshez tartozó sessiont ill. kukit. Így az nem jár le akkor sem, ha a látogató túl sokat piszmog az űrlapod kitöltésével - ez volt a probléma, ugye?
8

ini set és társai

vbence · 2008. Május. 30. (P), 15.35
Használhatsz .htaccess-t is (nézz utána a php_flag és php_value direktíváknak). Lekérezni úgy tudod, hogy küldesz egy oldalt, amihez alapból állítasz egy cookie-t, ami redirectel egy másik oldalra, ami ellenőrzi, hogy megvan-e. Vahy JS használatával (document.cookie).
3

Véletlen számmal

Thom · 2008. Május. 30. (P), 13.14
Másik megoldásnál az űrlap elküldésekor generálsz egy véletlen számot, azt tárolod a szerveren + elküldöd az űrlap egy rejtett mezőjeként is.
A szerveren feljegyzed azt is, milyen űrlap érvényesítő kódot melyik véletlen számmal küldted ki.

Ezután a kitöltött űrlap feldolgozásakor már csak azt kell megnézned, hogy van-e benne véletlen számot tartalmazó rejtett mező és az űrlapban a mellé tárolt érvényesítő kódot küldték-e be.
Ehhez már nem kell session, vagy kuki sem, kliens oldali js sem, viszont valahogy tárolnod kell az elküldött adatokat valahogy a szerveren.
5

Böngésző bezárásig

attlad · 2008. Május. 30. (P), 15.25
a session érvényessége 20 perc után lejár

Miért nem úgy állítod be, hogy böngésző bezárásig legyen érvényes? (Ill. a session fájlt/adatbázis bejegyzést/stb. törölheted sokkal később is, mondjuk ha az utolsó 24 órában nem használtad.)
6

iframe

vbence · 2008. Május. 30. (P), 15.33
JS-mentes megoldás: ha iftame-et használsz, az újratöltést megoldhatod, ha ilyet küldesz vissza:

<html>
<head>
<meta http-equiv="refresh" content="300"/>
</head>
...
</html>
a cache-kezelést itt megoldhatod a Thom által említett header-ekkel. További metákat is használhatsz pl:

<meta http-equiv="Cache-Control" content="no-cache"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>
...de a header biztosabb.