====== Autentizace a autorizace ====== ===== Úvod ===== * Jaký je rozdíl mezi autentizací a autorizací? * Jakým způsobem je možné nabourat autentizaci a autorizaci aplikace? * Co je Cross-site scripting (XSS) a Cross-site request forgery (CSRF)? * Jak se dá těmto typům útoků zabránit? * Materiály: [[http://en.wikipedia.org/wiki/Cross-site_scripting|XSS]], [[http://en.wikipedia.org/wiki/CSRF|CSRF]], [[http://talks.php.net/show/php-under-attack|XSS and CSRF tutorial]] ===== Úkol 1 ===== * Vytvořte stránku s přihlašovacím formulářem (uživatelské jméno a heslo). * Zajistěte, aby heslo zadávané ve formuláři nebylo vidět na obrazovce. * Přístupové účty uživatelů budou uloženy v databázové tabulce. * Vytvořte tři stránky, na které bude možné přistoupit pouze po přihlášení. Propojte je odkazy s přihlašovacím formulářem (na způsob jednoduchého menu). DROP TABLE IF EXISTS uzivatele; CREATE TABLE uzivatele ( uid INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, uzivatelske_jmeno VARCHAR(20) UNIQUE NOT NULL, jmeno VARCHAR(100) NOT NULL, heslo VARCHAR(100) NOT NULL, pokusu INTEGER UNSIGNED NOT NULL ) TYPE = 'InnoDB'; INSERT INTO `uzivatele` (`uzivatelske_jmeno`, `jmeno`, `heslo`, `pokusu`) VALUES ('a', 'Pokusny uzivatel 1', 'a', 0), ('b', 'Pokusny uzivatel 2', 'b', 0); SELECT heslo, pokusu FROM `uzivatele` WHERE uzivatelske_jmeno='$uziv_jmeno'; UPDATE `uzivatele` SET pokusu=$pokusu WHERE uzivatelske_jmeno='$uziv_jmeno'; ===== Úkol 2 ===== * Heslo uživatele ukládejte v databázi zašifrované. * Ošetřete skripty náležitým způsobem proti SQL injects. * Jakým způsobem by šlo zajistit, aby se heslo odesílalo na server rovnou zašifrované z prohlížeče klienta? ===== Úkol 3 ===== * Účet uživatele blokujte po třech neúspěšných pokusech o přihlášení. * Přidejte administrátorskou stránku pro odblokování konkrétního uživatelského účtu. ===== Úkol 4 ===== * Upravte aplikaci tak, aby automaticky odhlašovala uživatele, který není po určitou dobu (např. 30s) aktivní. ===== Úkol 5 ===== * Upravte vytvořenou aplikaci tak, aby zabraňovala možným CSRF útokům. ===== Úkol 6 (domácí úkol) ===== * Upravte aplikaci tak, aby přístupový účet kromě uživatelského jména a hesla obsahoval i informace o stránkách a konkrétních objektech na stránce, ke kterým má uživatel právo přistoupit. * Pokud bude uživatel přihlášený ale nebude mít práva na konkrétní stránku, vypíše se odpovídající chybová hláška. * Pokud uživatel nebude mít práva na konkrétní objekt na dané stránce, objekt se nezobrazí. Jako objekt berte obecný validní fragment HTML, který je vložený v elementu **div**. ===== Materiály ===== * [[http://www.michalspacek.cz/clanky|Michal Špaček - Webová bezpečnost]] * [[https://crackstation.net/hashing-security.htm| Salted Password Hashing]] ===== Řešení ===== {{:courses:b6b39zwa:tutorials:10:autentizace_reseni.zip|aplikace prihlaseni - reseni}} {{:courses:b6b39zwa:tutorials:solutions:11:cv_auth.zip|Řešení 6.1.2016}}