Diskuze: Sessions
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Když příjdu na tvůj web na administrace.php ale nikdy sem se nepřihlásil tak mně to tam pustí?
Jestli se do administrace.php dostanu bez přihlášení tak do administrace.php vlož toto:
<?php
$login = $_SESSION['jmeno'];
if($login == ""){
header("Location: tam_kde_se_prihlasuje.php");
exit;
}
$login = "";
?>
Špatně jsem to napsal. Musíš být už přihlášený aby ses tam dostal. Teď už mi jde jen o to, aby se to pokaždé odhlásilo a každý se musí přihlásit znovu.
Uff, to je hodně odvážné. Jak víš, že nepřihlášený uživatel bude
mít v $_SESSION['jmeno']
prázdný string a že bude vůbec
existovat? To je extrémně nebezpečné. Už z principu děláme zabezpečení
tak, že vstup považujeme za neplatný, dokud se nepřesvědčíme o jeho
platnosti. Takže to má fungovat tak, že přístup zamítneme pokaždé, když
v $_SESSION['jmeno']
není něco, co očekáváme.
Takže správně by to bylo asi takto:
$login = $_SESSION['jmeno'] ?? false; // pokud neexistuje nebo je null, bude false (funguje až v PHP 7)
if($login == 'admin'){
// ok, pokračuj
} else {
// nepřihlášen, přesměrovat na přihlášení nebo něco takového
die();
}
Pokud informaci o přihlášení ukládáš pouze do session, tak zmizí po
zavření prohlížeče a bude se třeba přihlásit znovu.
Myslím, že nelze udělat něco ve smyslu, že když zavřeš záložku s
administrací, odhlásíš se.
Pravděpodobně bys chtěl udělat odhlášení, kde by se session zahodila -
bude třeba funkce session_destroy()
. Dej si pozor, nemusí se
chovat přesně tak, jak chceš, doporučuji přečíst si dokumentaci. Ale v
zásadě je třeba tu funkci zavolat, případně udělat nějaký úklid a
skončit (pravděpodobně přesměrovat předtím), nesmíš
pokračovat někde dál, nedopadlo by to dobře, protože data v
$_SESSION
zůstanou.
Takže budeš chtít třeba něco takového:
logout.php:
<?php
session_destroy();
header("Location: /index.php");
die();
a v žádném případě ne něco takového (pokud opravdu
nevíš, co děláš, což nevíš)
administrace.php:
if (isset($_GET['action'] && $_GET['action'] == 'logout'){
session_destroy();
// tady nastává podivné chování session, kdy neexistuje, ale dá se dál číst...
}
...
Jj, session se chova tak, ze dokud nezavres posledni okno prohlizece nebo neuplyne urcity cas, tusim php ma default nastavenych 17 minut, tak zustavas prihlaseny.
Tusim, v prohlizeci se neda probourat do jineho okna, zalozky z
bezpecnostnich duvodu. Mozna pres js objekt window.top.
Cili, neni mozne spustit js, ktery zjisti, zda je jeste nejake okno z daneho
serveru otevrene a kdyz neni, tak by spustil automaticky odhlaseni. Je ale mozne
spustit js event window.onbeforeunload, pri zavirani okna
https://developer.mozilla.org/…beforeunload
Cili, slo by udelat system, v php, ktery sleduje otevirani a zavirani
uzivatelova okna pomoci tohoto js a pokud bys v php nenasel zadne okno z daneho
serveru, tak bys uzivatele odhlasil.
Pokud ale nedelas specialni zabezpeceni, tak mi prijde zbytecne se s takovym
systemem prihlasovani drbat. Navic, to neni ani moc spolehlive. Dneska se
prohlizece hrouti nebo jej muzes zhodit pres spravce uloh. Pak nejspis nenastane
js udalost onbeforeunload A tim padem ti v php budou viset otevrene stranky.
Na druhou stranu, to by asi nevadilo, protoze, kdyz prohlizec spadne, prijdes o
session (stav, ze jakoby zavres vsechna okna). Pokud ti teda session nezcizi
nejaky hacker.
Jinymi slovy, nejbezpecnejsi je donutit uzivatele k odhlasovani.
Komunikace mezi okny je možná přes post message.
Problém je, že to, co chce je zkrátka něco nestandardního a proto to
nemusí vždy fungovat.
Přihlášení jsem upravil:
<?php
$pripojeni = mysqli_connect('127.0.0.1', 'root', '', 'letadla');
$promenalogin = $_POST["jmeno"];
$promenaheslo = $_POST["heslo"];
$login = mysqli_real_escape_string($pripojeni,$_POST["jmeno"]);
$heslo = mysqli_real_escape_string($pripojeni,$_POST["heslo"]);
$query ="SELECT * FROM uzivatele WHERE jmeno = '$promenalogin' AND heslo='$promenaheslo'";
$dotaz = mysqli_query($pripojeni, $query) or die(mysqli_error($pripojeni));
$overeni = mysqli_num_rows($dotaz);
if($overeni == 1) {
$_SESSION['jmeno'] ?? false;
session_start();
header("Location: administrace.php");
exit;
} else {
echo"Zadal jsi špatný login nebo heslo!";
}
?>
a do administrace jsem přidal tlačítko, které odkáže na logout.php
<?php
session_destroy();
header("Location: index.php");
die();
?>
Ale i po kliknutí na tlačíko mě to přesměruje na index.php, ale když chci do administrace, tak mě to automaticky přesměruje po kliknutí na přihlášení.
Děkuji
Jakou verzi php máš? To ?? funguje jen v php 7.
Jinymi slovy, nejbezpecnejsi je donutit uzivatele k odhlasovani.
Vies napisat aj kratky priklad ako by som uzivatela donutil - odhlasit sa,pred zavretim okna prehliadaca? asi bude cez JS:)
Stare tema.
"js event window.onbeforeunload"
Proc uzivateli neco vnucovat? At uz automatika nebo alert hlaska, pouzijes ten
event.
Podivej, ten problem je komplikovany. Tam je spousta moznosti, kdy to okno
uzivatel nema prilezitost vykrizkovat nebo to zapomene (treba na kiosku, pc
terminalu nekde v hale). Prijde cizi uzivatel a uz tam jede. Tady mas jen
moznost zkratit cas session nebo nejak sledovat uzivatele, jestli hybe mysi a
tak. A nebo otevrit v js socket-kanal a sledovat, zda na nem je nejaka reakce.
Kdyz uzivatel ale da to okno na 10 min do pozadi, muze se ping na socket kanalu
prerusit a odhlasit ho (protoze prohlizece setri energii a neaktivni okno
zpomaluji nebo uplne zastavi probihajici js, treba, mozna). Plus pad prohlizece
a dalsi veci, co jsem zminil.
Cili, je to 100% neresitelne (jen asi 85-95%). Muzes pouze podchytit ten event a
nastavit cas session.
Zobrazeno 14 zpráv z 14.