Autor Zpráva
Ivan1536
Profil *
Zjednodušený příklad na odhlášení.

Nejedná se mi teď o správné zabezpečení, session, authentizaci.

Mám index.php s přihlašovacím formulářem - action="index.php", method="POST" :

Začátek index.php:

if ($_POST['textpass'] == 'heslo') //kontrola hesla
header("Location: http/:/server.com/.../menu.php");
else
echo "špatné heslo";

Mám menu.php s odhlašovacím odkazem - href="menu.php?$logoff=true", tzn. method="GET":

if ($_GET['logoff'])
header("Location: http/:/server.com/.../index.php");

Po odhlášení se přesměruje opět na index.php

a já potřebuji zabránit uživateli, aby se vrátil na předchozí stránku( menu.php)
pomocí tlačítka "Zpět", "historie".

Zřejmě pomocí hlaviček (platnost stránky, cache), ale nevím jak.

Pomůže někdo?

Předem děkuji.

Ivan
Taps
Profil
Ivan1536
dobré by bylo využít session, které by po odhlášení ztratily platnost
Majkl578
Profil
taps: rikal, ze nechce session


zkusil bych
header("Cache-Control: no-cache, must-revalidate");
Majkl578
Profil
samozrejme do menu.php; musi to byt pred vystupem
Ivan1536
Profil *
Díky za odpovědi.

Zkoušel jsem to, ale není to ono.

header("Cache-Control: no-cache, must-revalidate"); mi nefunguje.

Když se vrátím k session, vím přibližně jak fungují, ale nevím jak

prakticky využít toho když jí odregistruju, jak zabránit vrácení se

na stránku z které jsem se odhlásil.

Ale napadla mě jedna možnost:

Kontroluju na začátku v menu.php znovu heslo if (isset($_POST['textpass']))

anebo ještě lépe tedy existenci session (nebo SID),

kterou registruju po zadání správného hesla v index.php.

A když to nesedí, tak hned přesměruju zpět na index.php (to přesměrování je zřejmě to

co jsem potřeboval)

Takže po odhlášení, když zadám zpět, tak jdu na menu.php,

které mě přesměrovává stále na index.php, protože už mu nepředávám $_POST['textpass']

nebo session je odregistrovaná. Tím dosáhnu toho co jsem chtěl, aby mě to nepustilo zpět.

Ale nevím jestli je to dobré řešení.

Znáte nějaké lepší?

Ivan
Mastodont
Profil
Ivan1536
Já myslím, že nic lepšího nenajdeš, protože Historii ani Zpět úplně zakázat nemůžeš.
Ivan1536
Profil *
Díky
TFSi
Profil
1) přihlášení - po ověření loginu, hesla nastartuji sezení přesměruji do účtu.
2) před prováděním jakékoliv akce v účtu kontroluji sezení
2a) sezení v pořádku - provedu normálně pokračuji
2b) sezení chybí - přesměruji pryč (nebo zobrazím chybu, logovací formulář, ...)
3) odhlášení - odstřelím sezení a přesměruji pryč.

Nebo jsem něco nepochopil?
Ivan1536
Profil *
Tak nějak jsem to myslel.

Ale mám další problém.

Přihlašují se uživatelé jedním heslem. Může být přihlášen vždy jen jeden.

Ten se odhlásí sám nebo automaticky po x minutách (zruším session, přesměruji).

Další uživatel po ověření hesla čeká až to nastane a pak se může přihlásit.

Nevím, ale jak zkontrolovat, jestli předchozí user odregistroval session (každý má svou na svém pc?).

Neexistuje nějaká globální nebo serverová proměná pro všechny?

Zatím jsem to obešel, ukládám po odhlášení do souboru "logoff" a při přihlášení "login"

a toto kontroluji. Ale když vypnu prohlížeč křížkem (onUnload),

tak nezapíšu "logoff", zůstane tam "login"a na stránky se už nikdo nedostane.

Napadá mě javascript a body onUnload.
Location.href nejde a onUnload snad nepodporují všechny prohlížeče.

Funguje window.open, tzn. otevřu novou stránku, ta zapíše a zavře se window.close
Ale to se mi zdá dost nemotorné.
TFSi
Profil
Po x minutých neaktivity automaticky odhlásit.
Do toho souboru kde hlídáš přihlášení si ukládej čas jako unixový timestamp.
Při každé akci v uživatelském účtu uprav hodnotu v tom tvém souboru na aktuální.
Při každém pokusu o přihlášení kontroluj počet minut od poslední události (čas uložený v souboru). Když je třeba 5 minut, přihlaš dalšího uživatele.
A nastav to tak, aby se dalo přihlásit až poté, co vyprší sezení předchozího uživatele.
Ivan1536
Profil *
Víceméně rozumím.

Ale pořád nevím, jak vykonat nějakou událost na serveru,
která spustí kontrolní skript v php.

Myslím tím, že nechci použít javascript (časovač aj.).

Co když předchozí user odešle formulář, zapíše se tedy čas,
a on se neodhlásí a pak třeba usne. A uběhne x minut,

a v kodu je kontrola: když je aktuální čas větší než poslední zaznamenaný čas + x minut,
tak zruš sezení.

Jak spustím kontrolu, když user nevykoná žádnou událost?

Jedině že, ten následující user spustí kontrolu času, po přihlášení a protože
x minut uběhlo, může se tedy přihlásit, i když ten první má stále sezení.
A ten spící se kdykoliv probudí, pošle znovu formulář, po odeslání se nejprve zkontroluje čas,
a protože x minut uběhlo, zruší se sezení a třeba se přesměruje na přihlašovací okno. Hodnoty z formuláře se tedy už nepřeberou.
Myslíš to tak nějak?

Tak nějak to dělám, ale neukládám čas poslední akce, ale čas přihlášení 1. usera.
A čekám x minut a pak meta tag refresh (x minut) vykoná tu událost, která spustí tu kontrolu.
To ukládání času poslední akce bude lepší.

Ivan
TFSi
Profil
Během přihlašování:

$offset = 60*60*5; //5 minut
$time = file_get_contents('soubor');
if($time + $offset < time()) // poslední uživatel nebyl 5 minut aktivní, právně přihlašovaný uživatel může pokračovat
else // uživatele nepřihlásím, zobrazím chybu nebo něco takového

Na začátku účtu (provede se po každém kliknutí na odkaz, odeslání formuláře, ...):

$handle = fopen('soubor', 'w');
fwrite($handle, time());
fclose($handle);


a někde vedle toho (třeba přes .htaccess) nastavíš platnost sezení na 5 minut.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: