Problém při vyplnění špatného hesla Nette\Security\AuthenticationException #2
- KillPrd
- Začátečník | 110
Ahoj používám funkci autentizece ze sanboxu a při přechodu na novou verzy nette pro PHP 5.3 tedy poslední co je mi to hází chybku při vyplnění špatného hesla. Heslo nemám zaheševané ale mám ho šifrované pomoci MD5. A hází mi to chybku
<?php
Nette\Security\AuthenticationException #2
?>
a odkazuje se na tento řádek
<?php
throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);
?>
Bohužel jsem nikde nevyčetl jak postupovat pro odstranění chybky…
Editoval KillPrd (19. 7. 2011 9:46)
- Jan Voráček
- Člen | 90
Čau. Jestli jsi dřív používal k zahashování hesla pouze funkci
md5()
(ano, md5 je hash) a nyní používáš metodu
calculateHash()
z Authenticator
u, musíš buď
odstranit sůl, nebo zachovat konzistenci hashů nějak jinak.
Pokud bys chtěl sůl používat, což ti doporučuji, dej vědět a budeme se bavit dál.
- KillPrd
- Začátečník | 110
Tak abych se přiznal asi ti dost nerozumím co myslíš tou solí :)
jinak zpracování mám takto:
<?php
if ($row->password !== md5($password)) {
throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);
}
?>
tedy co bych měl odstranit? sůl co to je :)
- Ascaria
- Člen | 187
sůl je string ktery ma za ukol měnit hash hesla.. kdybys měl heslo například „ahoj“ a jeho md5 by byl „789asd“, bude takovy uplne vzdy, coz je slabina. kdyz k nemu ale pridas sul, napriklad „ahojXxXxXxX“ tak bude hash uplne jiny, treba „456qwe“ a pritom heslo bude uplne stejne. akorad pri ukladani a overovani hesla k nemu musis tu sul vzdy pridavat v phpcku
- KillPrd
- Začátečník | 110
zda dobře chápu melo by to být takto
<?php
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = dibi::fetch('SELECT * FROM admin WHERE username=%s', $username);
if (!$row) {
throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $this->calculateHash($password)) {
throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new NS\Identity($row->id, $row->prava, $row->toArray());
}
public function calculateHash($password)
{
return md5($password . str_repeat(rand(1,10), 10));
}
?>
Ale stále mi to neřeší můj problém…
Editoval KillPrd (19. 7. 2011 15:01)
- Jan Voráček
- Člen | 90
Ne, pokud sis hesla uložil v md5 a chceš co nejjednodušší řešení, má to být takto:
<?php
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = dibi::fetch('SELECT * FROM admin WHERE username=%s', $username);
if (!$row) {
throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $this->calculateHash($password)) {
throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new NS\Identity($row->id, $row->prava, $row->toArray());
}
public function calculateHash($password)
{
return md5($password); // bez soli = hash čistého hesla
}
?>
- KillPrd
- Začátečník | 110
Jo tak jsem to měl také ale stále tu je problém že při špatném hesle
mi to vyhodí chybovou hlášku
Nette\Security\AuthenticationException #2
a toho se nemohu zbavit…
Přece při chybovém hlesle by to mělo přesměrovat a hodit hlášku zadali jste špatné heslo…
Editoval KillPrd (19. 7. 2011 18:18)
- Jan Voráček
- Člen | 90
Aha :) Přehlédl jsem, že tvá „chyba“ je správně fungující kód. Chybu sis zanesl v přihlašovacím formuláři. Mrkni do čistého sandboxu (do SignPresenteru na signInFormSubmitted), jak je to vyřešené – je to přesně, jak uvádí pilec.
Editoval Jan Voráček (19. 7. 2011 19:48)
- KillPrd
- Začátečník | 110
Tak problém byl v zápisu proměnné $values
pokud jsem měl takto zapsáno nefungovalo to: <?php
$values[‚remember‘]?>
Pokud jsme to mám takto: <?php $values->remember?> tak to funguje!
Děkuji moc tohle by mě nenapadlo hlavně člověk když už neví kudy kam ta se musí vrátit na začátek že :)