Autor Zpráva
H13
Profil
Ahoj,

potřeboval bych poradit, zplácal jsem dohromady přihlášení do systému (jsem php těžký amatér). Funguje tak, že se někdo přihlásí do systému a když v něm 20 minut nepracuje, automaticky se odhlásí.

Potřeboval bych poradit, zda toto přihlášení nejde udělat jednodušeji, ale hlavně zda je bezpečné (mám samozřejmě na mysli úroveň bezpečnosti např. jaká se používá při přihlášení tady v diskusi, prostě aby nebylo zase tak jednoduché se do systému z venčí dostat)

kód:

# Prihlaseni ----------------------------------------------------
# uzivatel se prihlasi ------------------------------------------
if (isset ($_POST["password"]))
{
$_SESSION["password"] = $_POST["password"];//ulozi heslo do session
$time = strtotime("now");
$_SESSION["time"] = $time;//ulozi cas do session
}
else
{
$password="";
}

# uzivatel se odhlasi -------------------------------------------
if (isset ($_GET["logout"]))
{
if ($_GET["logout"]=="ano")
{
unset($_SESSION['password']);//ukonci session heslo, kdyz uzivatel klikne na odkaz odhlaseni
unset($_SESSION['time']);//ukonci session cas, kdyz uzivatel klikne na odkaz odhlaseni
}
}

# uzivatel je prihlasen - dochazi k obnoveni stranky ------------
if (isset ($_SESSION["password"]))
{
if ($_SESSION["password"] == "nejakeheslo")
{
$password= $_SESSION["password"];
if(isset ($_SESSION["time"]))
{
$time = $_SESSION["time"];//ulozi cas prihlaseni ze session do promene
$timeend = $time + 1200;//nastavi automaticky konec za 20 min
$timenow = strtotime("now");
if ($timenow > $timeend) //kdyz uzivatel neprovedl na strance behem 20 minut zadnou akci
{
unset($_SESSION['time']);unset($_SESSION['password']); echo "Byl jste automaticky odhlášen<br /><a href=\"index.php\">Prihlaste se prosím znovu</a>";exit;
}
else
{
$_SESSION["time"] = $timenow;// obnoveni stranky - posunuti autom. konce
}
}

}
else
{
$password="";
}
}
else
{
$password="";
}

Teď už je na strance normální podmínka

Když (if) heslo souhlasí – ukaž obsah
Jinak (else) – ukaž formulář pro přihlášení
Charlie
Profil
Pozměnil bych logiku celého přihlašování:

1) Zkontrolovat čas v _SESSION, když se překročí 20 minut, zničit _SESSION pomocí session_destroy(), refresh (kvůli _SESSION)
2) Zkontrolovat, zda-li je heslo v _SESSION, když ano, tak nepokračovat
3) Když není heslo v _SESSION, zkontrolovat _POST, když heslo souhlasí, zapsat do _SESSION, když ne, nezapisovat.

Tohle řešení má dvě výhody:
1) Nesprávné heslo se nezapisuje do _SESSION
2) session_destroy() zničí i session_id() - identifikátor seance. Při dalším požadavku na stránku (refresh) se vytvoří úplně nová seance, nehrozí tedy, že by se do ní dostala data z té staré. S mazáním (unset) proměnných je všeobecně problém, problémový kód by mohl být zde:
unset($_SESSION['time']);unset($_SESSION['password']);

Když se z nějakého důvodu neprovede druhý příkaz (například kolaps serveru), zůstane tak heslo v seanci, ale čas poslední návštěvy už ne. Váš skript by pak způsobil, že by byl klient přihlášený natrvalo, protože byste neprováděl žádnou kontrolu času - proměnná by totiž neexistovala.

Základ bezpečnosti je promyslet všechny možné varianty běhu skriptů a promyslet, co se stane, když nebudou existovat některé z důležitých proměnných. Za bezpečnou stránku se považuje taková stránka, která ukočíruje jakýkoliv vstup (_GET, _POST, _COOKIE), chyby v seancích (_SESSION) a chyby za běhu skriptu nebo nečekané události. Žádná bezpečná stránka by také neměla vyhazovat chybovou hlášku naznačující její strukturu nebo původ chyby - tedy za ostrého provozu je nejlepší nahradit standardní PHP oznamování chyb za vlastní. Takovýchto chybových hlášek mohou využít hackeři k úplnému prolomení Vašich skriptů.
Leo
Profil
Necetl jsem to cele, ale proc heslo zapisovat do session, nechapu? Leo
H13
Profil

Necetl jsem to cele, ale proc heslo zapisovat do session, nechapu? Leo


Protože, jak jsem uvedl v závorce (jsem php těžký amatér), s php začínám, takže nevím, kam se zapisuje heslo, aby přihlášení bylo platné třeba pro 15 stránek, právě proto se také ptám, jak můj splácaný kód, který plní svoji funkci, zlepšit
H13
Profil

1) Zkontrolovat čas v _SESSION, když se překročí 20 minut, zničit _SESSION pomocí session_destroy(), refresh (kvůli _SESSION)


Tak nějak bych tomu všemu rozuměl a předělám to, jen nerozumím, co přesně znamená refresh, jakým způsobem provede php zvovunačtení stránky?

Jinak díky moc, tyhle věci prostě začátečníka nenapadnou
Toto téma je uzamčeno. Odpověď nelze zaslat.

0