Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Sessions

Aktivity (2)
Avatar
Jakub Klindera:19.5.2018 14:02

Zdravíčko,
potřeboval bych pomoct s přihlašovacím systémem do administrace. Registrace do databáze zapisuje, login taky funguje (selectuje to z databáze).
Problém je v tom, že jak se přihlásím a pak třeba vypnu stránku, tak jsem automaticky přihlášený a nechce to heslo. To samé platí i když se administrace jmenuje administrace.php a pokud to někdo ví, tak může jen do vyhledávače napsat (http://domena.cz/…istrace.php/) a ono ho to automaticky pustí bez zadání hesla.

Děkuji

<?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_start();
             $_SESSION['jmeno'] = stripslashes($login);

             header("Location: administrace.php");
             die();
            } else {
             echo"Zadal jsi špatný login nebo heslo!";
            }

            session_destroy();
            ?>
 
Odpovědět
19.5.2018 14:02
Avatar
Matěj Strnad:19.5.2018 14:14

Když příjdu na tvůj web na administrace.php ale nikdy sem se nepřihlásil tak mně to tam pustí?

 
Nahoru Odpovědět
19.5.2018 14:14
Avatar
Matěj Strnad:19.5.2018 14:30

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 = "";
?>
 
Nahoru Odpovědět
19.5.2018 14:30
Avatar
Jakub Klindera:19.5.2018 16:05

Š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.

 
Nahoru Odpovědět
19.5.2018 16:05
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Matěj Strnad
Petr Čech:20.5.2018 0:26

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();
}
Nahoru Odpovědět
20.5.2018 0:26
the cake is a lie
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Jakub Klindera
Petr Čech:20.5.2018 0:39

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...
}
...
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
20.5.2018 0:39
the cake is a lie
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.5.2018 8:05

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.onbefo­reunload, 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.

 
Nahoru Odpovědět
21.5.2018 8:05
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Peter Mlich
Petr Čech:21.5.2018 12:48

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.

Nahoru Odpovědět
21.5.2018 12:48
the cake is a lie
Avatar
Odpovídá na Petr Čech
Jakub Klindera:21.5.2018 16:28

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

 
Nahoru Odpovědět
21.5.2018 16:28
Avatar
Šimon Rataj
Člen
Avatar
Šimon Rataj:21.5.2018 16:42

Jakou verzi php máš? To ?? funguje jen v php 7.

 
Nahoru Odpovědět
21.5.2018 16:42
Avatar
 
Nahoru Odpovědět
21.5.2018 17:10
Avatar
Jakub Klindera:21.5.2018 17:20

Vyřešeno, díky.

 
Nahoru Odpovědět
21.5.2018 17:20
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Peter Mlich
Alma Mater:31. října 2:13

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:)

Nahoru Odpovědět
31. října 2:13
Kopírovanie je forma zdieľania informácii, bez autorských práv sa informácie nezadržiavajú - šíria sa tam kde treba..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31. října 7:51

Stare tema.

"js event window.onbefo­reunload"
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.

 
Nahoru Odpovědět
31. října 7:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.