Do našeho e-shopu přidáme autentizaci (KDO je uživatel) a autorizaci (CO může uživatel dělat). Aplikaci může používat pouze přihlášený uživatel. Katalog může spravovat pouze administrátor.
- http://php.net/manual/en/function.hash.php - generace hashe ze vstupních dat
- http://php.net/manual/en/function.password-hash.php - hashování hesla
- http://php.net/manual/en/function.password-verify.php - kontrola hesla
- http://php.net/manual/en/features.http-auth.php - HTTP autentizace
Vytvořte na serveru eso.vse.cz ve vaší MySQL databázi tabulku goods (zboží) a users (uživatelé).
Naplňte vytvořenou tabulku testovacími daty. Testovací data lze vygenerovat např. aplikací http://www.generatedata.com/
Pro práci s DB budeme opět používat třídu PDO, která je abstraktním objektem nad jakoukoli databází:
Nezapomeňte v souboru nastavit váš xname a heslo pro připojení do db!
Zkopírujte scripty z adresáře 08-data do vašeho adresáře na serveru eso.vse.cz.
Funkční aplikaci pak najdete na adrese:
https://eso.vse.cz/~xhraj18/ (použijte váš vlastní xname :)
Případy užití:
Část pro nepřihlášeného uživatele/databázová autentizace:
- signup - registrace nového uživatele, ukázka práce s funkcí password_hash.
- signin - přihlášení existujícího uživatele, ukázka práce s funkcí password_verify.
Část pro přihlášeného uživatele:
- index - výpis zboží v e-shopu.
- buy - přidání zboží do košíku dle ID (ukázka práce se sessions).
- cart - výpis zboží přidaného do košíku (ukázka práce se sessions).
- remove - smazání zboží z košíku (ukázka práce se sessions).
- signout - odhlášení, zruší session (ukázka práce se sessions).
Část pro administátora (správce):
- new - přidání nového zboží do e-shopu, začne se nabízet ke koupi.
- delete - smazání zboží z e-shopu, přestane se nabízet ke koupi.
- update - úprava zboží v e-shopu.
Část pro autorizaci a HTTP autentizaci:
- user required - soubor pro require, vynucení přihlášení uživatele.
- admin required - soubor pro require, vynucení přihlášení administrátora, ukázka HTTP autentizace.
- Aplikaci může používat jen přihlášený uživatel - pokud není přihlášen, aplikace provede HTTP redirect na signin stránku. Viz user required.
- Jen admin může měnit katalog zboží. Viz admin required. Tato část používá HTTP autentizaci.
- Aplikace nemá ošetřené vstupy (prázdné heslo), pouze zamezuje SQL inject útoku. Do it yourself - udělejte si sami doma :)
- Otázky:
- Je HTTP autentizace bezpečná? Pod jakým protokolem musí aplikace běžet, aby HTTP hlavičky nešlo odposlouchávat?
- Jaké jsou výhody/nevýhody používání HTTP autentizace?
- Jak se jde odhlásit z HTTP autentizace?
- Jaké jsou formy HTTP autentizace? (Basic, Digest). Jak se liší?
- Hash = výstup hashovací funkce = digest = otisk dat = jednosměrný otisk nějakých dat pomocí známého matematického algoritmu. Pro člověka se špatně pamatuje. Vypadá jako náhodná data. Hash jednoho algoritmu bude mít stejnou délku pro jakkoli dlouhá vstupní data. Z výsledného hashe je prakticky nemožné (či velmi obtížné) určit vstupní data. I malá změna vstupních dat zcela změní výsledný hash. Pro různá vstupní data by neměly existovat stejné hashe (prolomeno u MD5 a SHA1).
- Příklady hashovacích funkcí - MD5, SHA1, SHA256, komplet seznam viz funkce hash.
- Pokud nevíte, kterou hashovací funkci použít, SHA256 a SHA512 jsou OK. Neberte MD5, ani SHA1.
- Při hashování je vhodné použít salt (sůl) = náhodná data, která jsou přimíchána do výsledného hashe (nebo uložena bokem) z původních dat. Smyslem je zamezit útokům pomocí tzv. rainbow table (duhová tabulka) - tzv. reverzní hashing = předvypočtené slovníky výsledků hashovacích funkcí, ze kterých lze odvodit původní vstupní data = ideální pro zjištění hesla, pokud se útočník nějak dostane k hashům.
- Hesla můžeme hashovat sami pomocí funkce hash, vybrat hashovací funkci, generovat vlastní sůl, atd.
- Nebo jednoduše použijeme funkci password_hash, která sama generuje bezpečnou sůl a používá aktuálně bezpečnou hashovací funkci. Vygenerovaný hash v sobě dále obsahuje použitou hashovací funkci a sůl. Tohle je preferovaný způsob hashování hesla v PHP.
- Pro ověření hesla použijeme funkci funkci password_verify.
- Viz ukázka použití funkce password_verify.
- Otázky:
- Které hashovací funkce nemáme používat? Proč?
- Co se stane, když útočník bude znát hash hesla? Jde z něj vypočítat či určit původní heslo? Jak?
- Co je duhová tabulka (rainbow table)?
- Musíme solit?
- Co se stane, pokud útočník bude znát jen sůl?
- Je možné mít sůl pokaždé stejnou? Nebo pokaždé jinou? Jaké jsou výhody/nevýhody?
- Proč se salt (sůl) jmenuje právě sůl? V čem je analogie?
-
Autentizace (z angličtiny)= autentifikace (asi z francouzštiny :) = authentization = kdo jsem = zjištění totožnosti uživatele.
-
Analogie s řidičským průkazem - kdo je řidič? Jméno, příjmení, fotka. Pokud nás zastaví, zda jsme to my.
-
Různé formy - záleží na tom, kde jsou umístěna data o uživatelích:
- databázová - ověření vůči datům v databázi - viz signin a user required.
- HTTP autentizace - podpora přímo v protokolu HTTP pomocí HTTP hlaviček, viz admin required.
- další, např. LDAP, NDS v Novell Intranetware, Active Directory od Microsoftu...
-
zabezpečení pomocí HTTP autentizaci lze realizovat i mimo kód aplikace - pomocí souborů .htaccess a .htpasswd
- k dispozici celá řada generátorů - viz např. .htaccess Tools
- lze využít např. pro jednoduché znepřístupnění aplikace při vývoji na serveru dostupném přes internet
- Autorizace = co můžu dělat, jaká mám oprávnění, kam mám přístup.
- Analogie s řidičským průkazem - když nás zastaví na Harley, máme na řidičáku skupinu A?
- Typicky mapováno na role a use-cases (případy užití) v aplikaci - v našem obchodu jen admin může měnit katalog zboží, ostatní uživatelé mohou používat aplikaci. Nepřihlášený uživatel nemůže aplikaci vůbec používat.
- Nastudujte HTTP Digest autentizaci. Viz http auth.
- Upravte aplikaci tak, aby byl i administrátor ověřován pomocí databáze
- Zrušte HTTP autentizaci.