Autor Zpráva
skrofa
Profil *
Potřebuji vytvořit jednoduché zaheslování na jednu stránku, kde budou formuláře na ukládání dat do databáze. Na stránku budou mít přístup pouze dva lidé se stejnými přihlašovacími údaji, takže nepotřebuji mít údaje v databázi a ověřovat je odsud. Na tuto stránku ovšem povede z webu odkaz.
Napsal jsem takovýto jednoduchý skript, pro ověření přihlašovacích údajů, ovšem nevím, jak je na tom s bezpečností. Vím že PHP skript se zpracovává na serveru a ke klientovi přichází už čisté HTML, takže to, že heslo je napsané v proměnné, by asi neměl být problém.
<?php

if (empty ($_POST["jmeno"])) {$jmeno = "0";}        else {$jmeno = $_POST["jmeno"];}
if (empty ($_POST["heslo"])) {$heslo = "0";}        else {$heslo = $_POST["heslo"];}


if (empty ($_POST["jmeno"]) and empty ($_POST["heslo"]))
{ 
echo "<h3>Pro přístup do administrační části webu se musíte přihlásit.</h3>";
include "prihlaseni.php";
}

elseif ($jmeno=="admin" and $heslo=="sezameotevrise")
{
echo "<h3>Administrační část webu</h3>";                                                                                        
include "vlozit_data.php";
}

else {
echo "<h3>Špatně zadané jméno nebo heslo!<br>Můžete se zkusit přihlásit znovu:</h3>";
include "prihlaseni.php";
}
?>

Jsem si vědom toho, že uživatel nezůstává trvale přihlášen, to mi nevadí. Spíš mi vadí, že se tam dá proklikat přes tlačítko ZPĚT.

Nebo existuje nějaké lepší řešení? Poraďte
johnl
Profil
Nejlepší by bylo heslo v proměnné zahashovat (a poté porovnávat jen hash) a přihlášení řešit pomocí session - kde po zrušení session (např. odhlášení) by jakékoli proklikání „Zpět“ postrádalo smysl..
skrofa
Profil *
johnl:
Nejlepší by bylo heslo v proměnné zahashovat
To znamená, že může tedy neoprávněná osoba heslo z té proměnné nějak získat?

A řešení s session je dobré. Díky
Keeehi
Profil
skrofa:
To znamená, že může tedy neoprávněná osoba heslo z té proměnné nějak získat?
Nemůže. Pokud se nedostane přímo ke kódu, což by však neměl.

A řešení s session je dobré.
Nezapomeň nastavit http only u cookie pro session.
johnl
Profil
skrofa:
To znamená, že může tedy neoprávněná osoba heslo z té proměnné nějak získat?
Pravděpodobnost je velmi malá, ale může se stát že se někde zaregistruješ a použiješ stené heslo jako např. na email, nebo ftp a pak by mohl někdo získat ke kódu přístup, ale pravděpodobnost že se něco takového stane je opravdu minimální.. Ale přece jen je to bezpečnější..
Keeehi
Profil
johnl:
1) Odpovídáš na něco jiného, než se skrofa ptal.
2) V čem by bylo lepší použít uložený hash. Při přihlašování bude stejně zadávat normální heslo, takže ten problém s registrací se steným heslem to neřeší.
skrofa
Profil *
Něco jsem o tom hledal na netu, takže, jestli jsem to dobře pochopil...
Ze samotného skriptu heslo nikdo nepřečte (pokud nemá třeba přístup ke skriptu přes ftp), ale může ho odposlouchávat při komunikaci klient → server. Znamená to tedy, že někdo muže získat heslo v okamžiku, když se přihlašuji? Proto ho mám zašifrovat? A kvůli tomu je u cookie to nastavení http only? (To budu muset ještě nastudovat, s session a cookies moc zkušeností nemám.)

A jak je to s metodou POST? Ta jde asi také odpostlouchávat, že?

A existují ještě nějaká jiná reálná rizika u podobného skriptu, jako mám výše?
Stano
Profil *
Keeehi:
Uložiť si do súboru hash je vtom lepšie že ak by sa niekto dostal k tomu súboru. či už výpadok alebo chyba apache alebo hack. tak takto si prečíta hash a musí lamať ešte ten aby mohol použiť daný formulár. ak tam bude rovno heslo tak mu stačí zadať heslo. a v podstate hovorím to isté ako Johnl..... (inými slovami uložiť tam hash z toho istého dôvodu prečo sa aj v DB ukladá hash. ani tam sa predsa nikto nikdy nemá ako dostať. tak načo hashovať.)
Keeehi
Profil
Stano:
Ano, to máš pravdu. johnl sice taky psal o hashi ale jeho použití zdůvodňoval něčím, co s tím ale nemělo co dělat.

skrofa:
Proto ho mám zašifrovat?
Proto ne, ale pro důvody, které psal Stano. Když někdo bude odposlouchávat komunikaci, tak ať je heslo zašifrováno/hešováno jakkoliv, vůbec to ničemu nepomůže. Možnost by byla použít https.

A kvůli tomu je u cookie to nastavení http only?
Ne. To je tam kvůli tomu, že kdyby jsi měl na stránce nějakou bezpečnostní díru, tak aby ta přihlašovací cookie nešla ukradnout. Kdyby ti ji někdo ukradl, server by si myslel, že seš to ty.

A jak je to s metodou POST? Ta jde asi také odpostlouchávat, že?
Ano. Ono se "GET" a "POST" nepřenáší odděleně ale jako jeden požadavek.
skrofa
Profil *
Mám ještě jeden dotaz.
Týká se to toho, co napsal johnl:
přihlášení řešit pomocí session - kde po zrušení session (např. odhlášení) by jakékoli proklikání ‚Zpět‘ postrádalo smysl..

Přihlášení pomocí session jsem si vytvořil podle jednoho návodu. Všechno šlape. Po přihlášení projdu několik stránek a pak se odhlásím. Když v historii listuji zpět, jsem pořád odhlášený. Ale, když se dostanu na první stránku (na kterou mě to přesměrovalo po přihlášení) prohlížeč mi nabídne znovu odeslání požadavku, a tím mě opět přihlásí. Takže se LZE "proklikat zpět"!

Příjde mi to i logické, protože na tu první stránku se po obnovení požadavku znovu odešlou přihlašovací údaje, takže se znovu vytvoří session (asi). Bohužel, s tímto nemám žádné zkušenosti (ani znalosti), takže nevím, jestli to tedy jde udělat, jak psal johnl.
johnl
Profil
skrofa:
Toto by se dalo spíš nazvat „chybou prohlížeče“, možná by bylo řešením do session ukládat ještě např. čtyřmístné náhodné číslo a pak name odesílacího inputu dát na "jmeno_7843", při každém požadavku na stránku vygenerovat toto číslo nové a dosadit jej i do name inputu, při odesílání se musí tyto čísla shodovat, jinak se požadavek neprovede (nesmíš vygenerovat nové číslo ještě před odesláním přihlášení)..
Keeehi
Profil
skrofa:
Do přihlašovacího formuláře vložit skrytý input a do něj token na jedno použití. Při přihlášení se to zkontroluje. A když ten prohlížeč potom po proklikání se zpět znovu odešle formulář, tak se to zjistí, protože už ten token byl použit.

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: