
PHP: Přístup k stránkám zabezpečený heslem bez MySQL - je to bezpečné?
Dobrý den,
pro tentokrát řeším problém přihlášení do administračního centra bez použití databáze.
Přihlášení probíhá takto:
// hlavičky
include('../header.php');
// uživatel
$admin_user = 'user';
$admin_pw = '6e017b5464f820a6c1bb5e9f6d711a667a80d8ea';
// přihlášení (případné:-)
if ( $_POST['user'] != $admin_user or sha1($_POST['pw']) != $admin_pw ) {
$_SESSION['login_err'] = 0;
presmeruj('../prihlas.php');
}
else {
$_SESSION['login'] = 1;
unset($_SESSION['login_err']);
presmeruj('../index.php');
}
Někde jsem četl, že přímo porovnání hesla není moc bezpečné, proto jsem přidal funkci sha1(), někde jsem taky četl něco o crypt, tak nevím.
Je toto řešení bezpečné proti případným útokům?
Dík za případné odpovědi
Bezpečnost se dá rozlišovat na dvě úrovně.
První úroveň bezpečnosti je "bezpečnost vůči okolnímu světu".
Zajištění této bezpečnosti není tak složité, pokud nastavení skriptu neobsahuje hrubou chybu a pokud je nastavení serveru rozumné (např. není dovoleno stahovat libovolné soubory a procházet je na serveru).
Druhou úrovní je zabezpečení proti někomu kdo má na server "přímý přístup" - tedy další správce.
Na tvém skriptu se mi jako laikovi a běžnému uživateli nelíbí už odpohledu jedna věc.
Nastavuje se tam $_SESSION['login'] na 1, jestliže je uživatel přihlášen.
Ovšem co se stane, jestliže někdo podstrčí pomocí nějakého rozšíření Firefoxu (např. tuším live headers) $_SESSION['login'] = 1 přímo ?
Přístup by asi měl být přímo vázán na proměnnou obsahující heslo od uživatele, než na nastavení jiné proměnné na trvalé hodnotě.....
BTW: databáze je jen prostředek na uchovávání dat. Jestli jsou data nakonec brána z databáze nebo někde ze souboru je formálně úplně ukradené.
Aha, tak to jsem přesně potřeboval vědět.
V tom se teda polepším.
Ty teda máš na mysli, že je lepší přímo do session uložit uživatelské jméno a zašifrované heslo?
Já myslel, že by se mohlo stát, že to s tama někdo "čmajzne", takže jsem tyto údaje do session nedával, takže od teď to tak vyřeším.
Děkuji moc za užitečnou odpověď
Hele, co tam m83 za tak tajné údaje, že to musíš mít pod pečlivým zámkem. Otisky prstů agentů FBI?
. Každej trošku zručnější hacker totálně v pohodě prolomí cokoliv "podomácku" udělaného. Ber to tak, že se povedlo i tohle:



http://www.zpravy.net/weblog/archiv/0407/google-hac k.php
O moc nic nejde, jen admin k eshopu, ale mám rád poctivou práci... Snažím se dělat, jak umím.
Session môžeš považovať za bezpečnú, takže si tam kľudne môžeš uchovávať čo len chceš. Asi by bolo lepšie si pamätať id alebo meno používateľa, než len jednu konštantu, aby si ho vedel neskôr v prípade potreby identifikovať.
Ten skript nemá z hľadiska bezpečnosti žiaden problém. Neviem, na čo tam máš login a login_err, keď stačí jedno. Ja by som si pamätal iba ten login a v prípade neúspechu by som ho unsetol.
Takhle.
Je to jen část z mého přihlašovacího skriptu a nastavením $_SESSION['login_err'] = 0 (což se nastaví při zadání chybných údajů) se přesměruje zpět k přihlašovacímu formuláři, který zobrazí chybu.
Asi takto:
Jo, jinak jsem teda podle místních rad a jednoho článku při přihlášení udělal tohle:
Jinak dík moc.
Bezpečnost není nikdy dokonalá. Jediná "dokonalá" možnost je přístup pouze z jediné tvojí IP adresy, ale i to se dá prolomit.
Přístup z jedný IP? U sdílené IP je to pěkná sranda...
* Co kdyby člověk šel rovnou na prihlas.php?
* Co kdyby člověk šel na header.php?
* Nemáš to zajištěný proti session fixation, za určitých podmínek by mohl jít útok s refererem. Oboje a další viz http://php.vrana.cz/zabezpeceni-session-promennych. php
* pokud $_POST['user'] nebo $_POST['pw'] neexistuje a v error_reporting je i E_NOTICE, vrhne to chybovou hlášku.
* A co CSRF? (XSRF) To se netýká přihlášení, ale jednotlivých akcí.
* Co kdyby člověk šel rovnou na prihlas.php?
Tohle mám vyřešené.
* Co kdyby člověk šel na header.php?
Rovněž vyřešené.
* Nemáš to zajištěný proti session fixation, za určitých podmínek by mohl jít útok s refererem. Oboje a další viz zabezpeceni-session-promennych. php
O tom si něco přečtu.
* pokud $_POST['user'] nebo $_POST['pw'] neexistuje a v error_reporting je i E_NOTICE, vrhne to chybovou hlášku.
Samozřejmě, že to vrhne chybovou hlášku, neposkytl údaje v POST, musí se přihlásit...
* A co CSRF? (XSRF) To se netýká přihlášení, ale jednotlivých akcí.
Tomuhle taky nerozumím.
XSRF dobře vysvětlil Jakub Vrána na cross-site-request-forgery.php .