Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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

Předmět Autor Datum
Bezpečnost se dá rozlišovat na dvě úrovně. První úroveň bezpečnosti je "bezpečnost vůči okolnímu svě…
Flash_Gordon 08.04.2008 19:53
Flash_Gordon
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ší…
Kuncek 08.04.2008 20:05
Kuncek
Hele, co tam m83 za tak tajné údaje, že to musíš mít pod pečlivým zámkem. Otisky prstů agentů FBI? :…
marekdrtic 08.04.2008 20:09
marekdrtic
O moc nic nejde, jen admin k eshopu, ale mám rád poctivou práci... Snažím se dělat, jak umím.
Kuncek 08.04.2008 20:25
Kuncek
Session môžeš považovať za bezpečnú, takže si tam kľudne môžeš uchovávať čo len chceš. Asi by bolo l…
los 08.04.2008 20:40
los
Takhle. Je to jen část z mého přihlašovacího skriptu a nastavením $_SESSION['login_err'] = 0 (což se…
Kuncek 10.04.2008 12:40
Kuncek
Bezpečnost není nikdy dokonalá. Jediná "dokonalá" možnost je přístup pouze z jediné tvojí IP adresy,…
marekdrtic 08.04.2008 19:58
marekdrtic
Přístup z jedný IP? U sdílené IP je to pěkná sranda... :-D
v6ak 10.04.2008 17:06
v6ak
* Co kdyby člověk šel rovnou na prihlas.php? * Co kdyby člověk šel na header.php? * Nemáš to zajiště…
v6ak 10.04.2008 17:04
v6ak
* Co kdyby člověk šel rovnou na prihlas.php? Tohle mám vyřešené. * Co kdyby člověk šel na header.ph…
Kuncek 10.04.2008 18:03
Kuncek
XSRF dobře vysvětlil Jakub Vrána na cross-site-request-forgery.php . poslední
v6ak 10.04.2008 20:13
v6ak

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ěď

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:

$err_login[] = 'Chybné údaje';
$err_login[] = 'Nějaká další chyba...';

echo $err_login[$_SESSION['login_err']];

Jo, jinak jsem teda podle místních rad a jednoho článku při přihlášení udělal tohle:

// úspěšné přihlášení
$_SESSION['login'] = array($uzivatel,$heslo);

Jinak dík moc.

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

Zpět do poradny Odpovědět na původní otázku Nahoru