Autor Zpráva
H13
Profil
Ahoj, neznáte někdo nějaký článek nebo návod, který by řešil jednoduše v PHP:

Přihlášení - prohlížení více stránek (převod hesla mezi stránkami)
Odhlášení - manuální, automatické např. po 10 min nečinnosti

Díky Honza
TooFew
Profil
Podívej se na http://www.linuxsoft.cz/php/ do kapitol o formulářích a o sessions.
H13
Profil
Podívej se na http://www.linuxsoft.cz/php/ do kapitol o formulářích a o sessions.

No pročetl jsem ty články a moc jsem se toho nedozvěděl...ty kódy jsou tam nedodělaný, v popisu tam někdo píše o automatickém odhlášení, ale do příkladu to nedá, pak tam používá u session unset, což mi tady v diskuzi charlie psal, že je to problémové...Pak tam mluví o přenášení hesel na více stránek, ale v příkladu použije jen jednu společně s větvením...no a nakonec tam napíše, když je kritizován za špatný a chybný příklady, že příklady jsou zjednodušený, aby to bylo více pochopitelný...No a to už jsem nevydržel, protože učit se ze špatných ale pochopitelných příkladů...na to opravdu nemám trpělivost
TooFew
Profil
No tak nevim. Ja tam vsechny priklady chapu a jako navod mi to pripada docela srozumitelne. Kdyby mel vypisovat cele priklady, asi by to psal dodnes ;-). Nicmene, musis zapojit fantazii a pak to jde. Ja mam na jednom svojem webu taky prihlasovani pres sessions a formulare a ucil jsem se jen z tohoto navodu.
H13
Profil
No já už jsem si systém přihlašování a odhlašování vytvořil, funguje mi na více webech...Jenže protože jsem se učil ze špatných příkladů, který upřednostňovali pochopitelnost před správností a úplností, tak jsem dopadl tak, že mi to sice funguje, jenže to není vůbec ošetřený proti případným chybám (výpadek serveru, ukládání zbytečných dat, atd...)

Proto bych byl rád za nějaké úplné a správné (i když to je samozřejmě neobjektivní) řešení...
krteczek
Profil
Prostě to funguje nějak následovně:
1. nejprve musíš inicializovat session

<?php
session_start();

2. vytvoříš přihlašovací formulář a na začátek skriptu umístíš podmínku která bude kontrolovat jestli byli odeslané přihlašovací údaje, a ověříš platnost přihlašovacích údajů.

if((!empty( $_POST['login']))and (!empty($_POST['password']))
{
if(($_POST['login']==='jmeno')and($_POST['password']==='heslo))
{

3. Pokud přihlašovací ůdaje souhlasí nastavíš session proměnnou $_SESSION['prihlasen']

//souhlasí, nastavíme session, může jich být více a můžeš v nich přenášet třeba jméno přihlášeného...
$_SESSION['prihlasen']=1;
//a znovunačteme stránku (předpokládám že je to index v kořeni webu
header("location: /");
exit;
}

4. Pokud nesouhlasí do proměnné ulolžíme chybovou hlášku a tu potom zobrazíme na stránce

else
{
//nesouhlasí
$sprava='<p>Litujeme, přihlašovací údaje nejsou platné.</p>';
}
}

5. ještě musíme vytvořit odhlašovací podmínku

if(isset($_GET['odhlasit']))
{
session_destroy();
header("location: /");
exit;
}

až potud jsou to podmínky které musí být před odesláním jakýchkoliv hlaviček kvůli použití header location
6. další podmínkou kontrolujeme, jestli je nastavena session $_SESSION['prihlasen'] a pokud ano zobrazíme to někde na stránce spolu s linkem vedoucím k odhlášení

if((!empty($_SESSION['prihlasen']))and($_SESSION['prihlasen']===1))
{
echo '<p>Jste přihlášen. <a href="index.php?odhlasit">Odhlásit se</a></p>';
}

a toto je celé kouzlo přihlášení/odhlášení. ted stačí jen ověřovat jestli je dotyčný přihlášen
krteczek
H13
Profil
krteczek

Tak to je přesně to co jsem potřeboval, díky...teď ještě jednu maličkost...jak nejlépe do toho skriptu zabudovat automatické odhlášení např. při 10 minutové nečinnosti
24k_work
Profil *
<?

session_start();

$limit=15;
if ((time()-$_SESSION['akce'])>$limit)
{
echo "odhlasen";
}

else
{
echo "alive";
}




if ($_GET['url'])
{

$_SESSION['akce']=time();

}

?>
H13
Profil
($_GET['url'])

tak tomuhle nerozumím, rozumím tomu, že se v session změní čas a vlastně se posune čas automatického odhlášení, ale nevím při jaké příležitosti - ($_GET['url']) ??
DJ Miky
Profil
H13
Čas autom. odhlášení se posune, když se načte nějaká stránka ($_GET['url'] je nenulové)
krteczek
Profil
H13: Platnost session je sama o sobě omezená, Většinou na cca 15 minut, existuje directiva kterou lze nastavit platnost session cookies přímo za běhu scriptu ini_set('session.gc_maxlifetime',čas v sekundách po kterém má platnost skončit); .

Ještě lze doplnit před nastavení přihlašovací cookie (u mne bod 3) session_regenerate_id() tim se vytvoří nové id session cookie

session_regenerate_id();
//ted nastavime teprve tu session
$_SESSION['prihlasen']=1;

krteczek
H13
Profil
DJ Miky

Čas autom. odhlášení se posune, když se načte nějaká stránka ($_GET['url'] je nenulové)

tak to mi tam asi ještě něco chybí ???

Notice: Undefined index: url in ...


Zajímalo by mě co se stane, když trochu změním výše uvedený kód (funguje to, nevím však, "jestli to nemá nějaké vedlejší účinky")
Vedle kódu od 24k_work jsem vyznačil změnu:
-----------------------------------------------------------
session_start();
$limit=15;
if ((time()-$_SESSION['akce'])>$limit)
{
echo "odhlasen";
}
else
{
echo "alive"; ......................zmena: pridan radek $_SESSION['akce']=time();
}

if ($_GET['url']) ...................zmena: vynechano
{ ...................zmena: vynechano
$_SESSION['akce']=time(); ...................zmena: vynechano
} ...................zmena: vynechano
?>

No a výsledek by měl být, že pokud není stránka aktualizovaná do 15 sec, pak se automaticky ukončí session (else "odhlasen")...Když se obnoví stránka a je obnovena do 15 sec., pak se vypíše "alive" a podle mě to znamená, že v tu chvíli se může posunout čas ... ($_SESSION['akce']=time();)
anode
Profil
krteczek: Hodnota HTTP hlavičky Location pro přesměrování by měla obsahovat absolutní adresu (viz RFC 2616: HTTP/1.1). A ještě bych doplnil, že ini_set() pro nastavení session.gc_maxlifetime se musí zavolat ještě před voláním session_start(), jinak už nemá efekt.
krteczek
Profil
anode: Díky za doplnění, nebyl jsem si jistý tím, kdy se ta directiva musí volat, ale vlastně z logiky věci to samo vyplývá (už mi to včera nemyslelo), nejprve je třeba nastavit dobu platnosti a teprva potom iniciovat session a používat je :-)
takže při použití té directivy není třeba ošetřovat dobu platnosti přihlášení, stačí na začátku scriptu použít

<?php
//nastavíme dobu platnosti session
ini_set('session.gc_maxlifetime',300); //300 = 5minut

//nastartujeme session
session_start();

//ověřujeme jestli byl odeslán přihlašovací script
if((!empty( $_POST['login']))and (!empty($_POST['password']))
{
if(($_POST['login']==='jmeno')and($_POST['password']==='heslo))
{
//souhlasí, resetujeme session_id
session_regenerate_id();

//nastavíme session, může jich být více a můžeš v nich přenášet třeba jméno přihlášeného...
$_SESSION['prihlasen']=1;

//a znovunačteme stránku (předpokládám že je to index v kořeni webu
header("location: http://".$_SERVER['SERVER_NAME']);
exit;//musí se použít ukončení scriptu jinak script doběhne až do konce
}
else
{
//nesouhlasí, připravíme si text chybové správy pro vypsání na stránce
$sprava='<p>Litujeme, přihlašovací údaje nejsou platné.</p>';
}
}

//odhlášení
if(isset($_GET['odhlasit']))
{
session_destroy();
header("location: http://".$_SERVER['SERVER_NAME']);
exit;
}

//teprve ted muže být normální html hlavička a za ní výpisy hlášek
...
<body>
<?php echo @$sprava;
if((!empty($_SESSION['prihlasen']))and($_SESSION['prihlasen']===1))
{
echo '<p>Jste přihlášen. <a href="index.php?odhlasit">Odhlásit se</a></p>';
}
?>

Navíc je dobré uložit si ip adresu klienta, jeho prohlížeč, a další věci zjistitelné o klientovi, vygenerovat náhodný text a posílat ho ze skrytých inputů formulářů a zároveň v session, a vždy po reloadu stránky kontrolovat jestli se shodují (myslím že je zbytečné zatěžovat každé zobrazení stránky dotazy na databázi).
krteczek
anode
Profil
Ono nastavení životnosti session je vlastně příkaz pro garbage collector, který se při session_start() s určitou pravděpodobností (dle nastavení) spustí. Pokud se spustí, smaže veškeré session-data soubory, které jsou starší než zadaná životnost, takže na tohle pozor, když už používat tohle řešení se zastaráváním celé session, tak dělat to stejně (a se stejným časem) na celém webu, jinak hrozí, že to návštěvníkovi na jiné stránce, na které ten limit takto nechceme, smaže session pod rukama, protože jiný návštěvník zrovna spustil garbage collector, který všechna session-data pod 5 minut smazal (garbage collector nerozlišuje, s jakou životností byla session uložena, zajímá ho pouze stáří).
Pokud tedy chceme např. uživatelsky definovatelný čas automatického "odhlášení", je lepší uložit do session čas posledního požadavku a kontrolovat (jako výše) anebo tak nastavit platnost jeho cookie (přes session_set_cookie_params).

Co se týká ukládání IP adresy, informace o prohlížeči apod., nejsem moc velký fanda tohoto přístupu. Když už, tak kontrolovat pouze IP a to navíc pouze pokud si to uživatel přeje. Při použití vytáčeného připojení, které je u nás stále dost používané, mohou různé požadavky téhož uživatele přijít z různých IP adres. Po cestě je taky proxy ISP...
H13
Profil
No protože potřebuji přihlášení pro více stránek, zdá se mi kontrolování času na každé stránce, kterou lze zobrazit jen při přihlášení, jednodušší - jestli to dobře chápu, pak stačí na všech stránkách (kromě té přihlašovací) kontrolovat pouze to, zda je aktivní session - přihlášení a session - čas ....

To znamená:
Přihlašovací stránka:
1. Kontrola login a password (z formuláře)
2. Vytvoření session (přihlášení, čas)
3. Kontrola session (přihlášení, čas - kontrola automatického odhlášení)
4. HTML - formulář pro zadání login a password
5. Zobrazení obsahu

Ostatní stránky (které budou zobrazeny jen při přihlášení)
1. Kontrola session (přihlášení, čas - kontrola automatického odhlášení)
2. Zobrazení obsahu


??? Ještě bych měl otázku, co se týče bezpečnosti... Co mám vložit do proměnné $_SESSION["prihlasen"]


Předpokládám, že výše uvedená hodnota 1 funguje pouze jako příklad:
Nastavení: $_SESSION["prihlasen"]=1;
Kontrola: if ((!empty($_SESSION["prihlasen"])) and ($_SESSION["prihlasen"]===1))
Kereal
Profil *
zkousel jsem tenhle i jiny ruzny kody, ale hazi mi to vzdycky chybu. konkretne radek 16, u podminky
if ((!empty( $_POST["login"])) and (!empty($_POST["password"])). jiny skripty co jsem zkousel me prihlasej jenom na to prvni nacteni stranky, pri znovunacteni me odhlasi... nevite nekdo co s tim?
anode
Profil
Kereal: Žel nikdo nemá věšteckou kouli, aby věděl, jakou "chybu to hází".
Kwíííítek
Profil *
myslím, že to kluci popsali dobře, jen by mě ještě zajímaly ty parametry session["prihlaseni"] na bezpečnost. Na http://php.vrana.cz/obrana-proti-sql-injection.php je taky zajímavý článek o "očištění" proměnné z INPUTu o injekce před zpracováním.

drogy, sex a programování :)
Toto téma je uzamčeno. Odpověď nelze zaslat.