Autentizace a autorizace Cílem kapitoly je seznámit s pojmy autentizace a autorizace a podrobněji probrat různé druhy autentizace. Klíčové pojmy: Autentizace, autorizace, protokol HTTP, hlavičky,.htaccess,.htpasswd AUTENTIZACE slouží k jednoznačnému určení uživatele, vstupujícího do systému ověření totožnosti uživatelů kvůli bezpečnosti i přizpůsobení se uživateli většinou probíhá tak, že uživatel zadá požadavek na něco, k čemu je přístup omezen je vyzván, aby zadat dvojici jméno-heslo po zadání hodnot proběhne ověření jména i hesla pokud vstupní data souhlasí, zobrazí se požadovaná stránka AUTORIZACE proces ověření přístupových oprávnění uživatele vstupujícího do systému většinou navazuje na autentizaci podstatou autorizace je ověřit, zda daný uživatel má oprávnění provést příslušnou akci 1 PROMĚNNÉ AUTENTIZACE PHP používá 2 předdefinované proměnné: $_SERVER['PHP_AUTH_USER'] $_SERVER['PHP_AUTH_PW'] dají se vytáhnout také z $_SERVER['HTTP_AUTHORIZATION'] 2012-09-13 Autentizace a autorizace 1/10
2 HLAVIČKY PHP Hlavičky spadají pod protokol HTTP. Některé nejsou definované v starších verzích HTTP, ale v HTTP 1.1 už jsou všechny. Hlavička je doplňkem/výstupem každé odpovědi/požadavku. Můžeme s nimi pracovat dvojím způsobem: generovat je a posílat spolu se skriptem nebo číst ty, které zaslal prohlížeč. 2.1 Čtení hlaviček V PHP je můžeme číst snadno, jsou uloženy v proměnných: hlavička Referer bude přístupná v proměnné $HTTP_REFERER hlavička User-Agent bude přístupná v $HTTP_USER_AGENT. všechny hlavičky zjistíme pomocí funkce GetAllHeaders(), která vrací pole se všemi hlavičkami. Funguje však jen pod Apačem: $headers = GetAllHeaders(); while (list($hlavicka, $obsah) = each($headers)): endwhile; echo "$hlavicka - $obsah<br>"; 2.2 Generování hlaviček Odesílání hlaviček v PHP pomocí funkce header() int header(string řetězec [,boolean nahradit_nebo_doplnit [,int kod_odpovedi]]) pak odesílám: hlavička: hodnota_hlavičky hlavičky musí být odeslány před odesláním jakéhokoliv textu!!! 2.3 Přehled hlaviček podrobně na: http://www.jakpsatweb.cz/html/hlavicka.html hlavičky označené * jsou dostupné len v HTTP/1.1 protokolu. Jsou uvedeny i nejčastěji používané hodnoty hlaviček. 2012-09-13 Autentizace a autorizace 2/10
Název Popis Zápis Cache-Control * můžeme cache-paměti a proxy-serverům přikázat, aby určitý dokument neukládali do vyrovnávací paměti Cache-Control: no-cache Connection * dokáže s hodnotou close uzavřít spojení Connection: close Pragma podobné použití jako Cache-Control Pragma: no-cache Accept * Accept-Charset * Accept-Language * From Host If-Modified-Since Referer User-Agent Location tato hlavička obsahuje informace o typech dat podporovaných klientem. Při každém type můžeme ještě určit akceptovatelnost parametrem q, od nuly do jedna. Např. q=0.5 je lepší jako q=0.2. Můžeme určit, které znakové sady podporuje náš prohlížeč. Obsahuje také parametr q. Touto hlavičkou můžeme sdělit serveru, jaký jazyk preferujeme. Hlavička obsahující elektronickou adresu uživatele, kvůli ochraně údajů už dnes nejsou prohlížeči moc podporované Táto hlavička obsahuje doménovou adresu uživatele. Jestliže chceme dokument dostat, jen když byl od daného data změněný Tato hlavička obsahuje url stránky, odkud přišel uživatel, tedy referera. Velmi užitečná a oblíbená hlavička. User-Agent posílá identifikaci prohlížeče, tedy jméno, číslo verze, a platformu, na které je spuštěný. Server odesílá url dokumentu, na který byl přesunutý. Také jím může přesměrovat. URL v hlavičke Location musí byť absolutní, tedy musí začínat http:// Accept: text/html, image/gif; q= 0,4 e/png; q=0.2 Accept-Charset: windows-1250; q=0.7, us-ascii; q=0.3 Accept-Language: cs, en; q=0.4 $HTTP_FROM; $HTTP_HOST; If-Modified-Since: Fri, 22 Jun 2001 17:04:05 GMT $HTTP_REFERER; User-Agent: Mozilla/4.0 (compatible; MSIE 5.01, Windows NT) Location: http://interval.cz/ Server Server posílá svoji identifikaci, jméno a verzi Server: Apache/1.4b2 Content-Type Expires Last-Modified Hlavička obsahuje typ dat, např. text/html - HTML, text - text/plain, obrázok - Gif image/gif,... Určujeme, po jakou dobu bude odpověď platná. Když uvedeme jako parametre aktuální čas, dokument se nebude ukládat do cache paměti. Táto hlavička obsahuje datum poslední modifikace dokumentu poslaného jako odpověď. Content-Type: text/html Expires: Fri, 22 Jun 2001 17:18:17 GMT $HTTP_LAST_MODIFIED 2012-09-13 Autentizace a autorizace 3/10
Příklad: když chceme, aby se náš dokument neukládal do cache paměti, na začátku skriptu, před textovým výstupem, napíšeme zabránění ukládání stránky do mezipaměti prohlížeče: header("cache-control: no-cache"); header("pragma: no-cache"); nebo uložíme do hlavičky aktuální čas: header("expires: ".GMDate("D, d m Y H:i:s")." GMT") přesměrování: header("location: http://www.cpress.cz"); 3 AUTENTIZAČNÍ FORMULÁŘ PROTOKOLU HTTP jestliže zadá požadavek na prostředek s omezeným přístupem, server odpoví zprávou 401 (neautorizovaný přístup), prohlížeč klienta rozpozná tuto odpověď a zobrazí okno: po ověření uloží prohlížeč informace do své vyrovnávací paměti, tam jsou uložena, dokud nejsou vymazána (okno zavřeno) uživatelské jméno i heslo je uloženo ve zvláštním souboru v poli hlavičky WWW-Authenticate obsahuje: metodu výzvy (nejčastěji základní metoda Basic - základní, zakódované pomocí algoritmu base-64), pomocí níž má prohlížeč zjistit a zakódovat informace (ale nezašifrované, nebezpečné) kódování Digest je bezpečnější než Basic, není podporováno všemi servery ani prohlížeči, vytvoří se náhodný řetězec-klíč a ten se odešle v hlavičce. oblast, pro niž autentizace platí (tady Soukroma autorizacni stranka) Obecně může vypadat ověření takto: if (isset($_server['php_auth_user']) and isset($_server['php_auth_pw'])) { // ověření totožnosti else { header('www-authenticate: Basic Realm="Soukroma autorizacni stranka"'); header("http/1.1 401 Unauthorized"); echo "Zadejte prosím uživatelské jméno i heslo"; exit; 2012-09-13 Autentizace a autorizace 4/10
Místo formuláře autorizace HTTP můžeme použít pro vstup dat vlastní formulář. 4 AUTENTIZACE PEVNĚ ZAKÓDOVANÁ VE SKRIPTU if (($_SERVER['PHP_AUTH_USER'])!= 'specuzivatel' or ($_SERVER['PHP_AUTH_PW'])!= 'specheslo') { header('www-authenticate: Basic Realm=" Soukroma autorizacni stranka "'); header("http/1.1 401 Unauthorized"); echo "Zadejte prosím správné uživatelské jméno i heslo"; exit; 5 AUTENTIZACE ZALOŽENÁ NA SOUBORU v textovém souboru uloženo uživatelské jméno a odpovídající zašifrované heslo uloženo vždy na 1 řádku a odděleno např. dvojtečkou je dobré mít tento soubor mimo kořen dokumentů serveru na šifrování mohu použít hashovací fci MD5() při ověřování totožnosti uživatele porovnávám vstupní hodnotu jména a hesla s hodnotami v souboru $autorizovano = FALSE; if (isset($_server['php_auth_user']) && isset($_server['php_auth_pw'])) { $radek = file("cesta\autentizace.txt"); foreach ($radek as $login) { list($uzivatel,$heslo) = explode(":", $login); $heslo = trim($heslo); if (($uzivatel == $_SERVER['PHP_AUTH_USER']) && ($heslo == md5($_server['php_auth_pw']))) { $autorizovano = TRUE; break; if (!$autorizovano) { header('www-authenticate: Basic Realm=" Soukroma autorizacni stranka "'); header("http/1.1 401 Unauthorized"); echo "Zadejte prosím správné uživatelské jméno i heslo"; exit; echo "A tady už jen pro vyvolené"; 2012-09-13 Autentizace a autorizace 5/10
6 AUTENTIZACE POMOCÍ DATABÁZE místo textového souboru použijeme tabulku z databáze sloupce: Id_uzivatele uzivatel zašifrované heslo-md5(), sha2() skutečné jméno (skupina) (IP-adresa) email pak porovnáváme např: "SELECT uzivatel, heslo, IPadresa FROM uzivatele WHERE uzivatel = $_SERVER['PHP_AUTH_USER'] AND heslo = MD5($_SERVER['PHP_AUTH_PW'] AND IPadresa = $_SERVER[REMOTE_ADDR']" 7 AUTENTIZACE POMOCÍ SOUBORŮ.htaccess a.htpasswd 7.1 Soubor.htaccess může značně ovlivnit nastavení serveru není vždy povolen je to textový dokument, lze jej tedy vytvořit libovolným textovým editorem pokud budete mít problém tento soubor uložit, nazvěte jej jako htaccess.txt a poté jej přejmenujte přímo na serveru pozor na nastavení ftp klienta, aby zobrazoval soubory začínající tečkou umístíme-li soubor.htaccess do hlavní složky našeho webu, budou se zápisy vztahovat na celý web, pokud ale umístíme soubor do podsložky, bude vztahovat na danou složku, čili je tady jakási stromová struktura. Ovšem pokud máme soubor v hlavní složce, neznamená to, že by jsme ho v jakékoli podsložce nemohli změnit, stačí, když do této složky umístíme další soubor.htaccess s novým pravidlem. 7.2 Co může obsahovat soubor.htaccess 7.2.2 Nastavení chybové stránky ErrorDocument 403 "http://www.banan.cz/" v případě nepovoleného přístupu se zobrazí stránka www.banan.cz ErrorDocument 404 "http://help.banan.cz/htaccess/stranka_404.html" v případě, že soubor neexistuje, přejdeme na stránku http://help.banan.cz/htaccess/stranka_404.html 2012-09-13 Autentizace a autorizace 6/10
7.2.3 Procházení adresáře Options -Indexes zákaz procházení adresáře Options +Indexes chceme v jedné složce zobrazení povolit, například pro umožnění stahování skriptů, obrázků atd v podsložce 7.2.4 Přístup z jednotlivých IP adres můžeme zakázat přistup jednotlivé IP adrese nebo celé skupině IP adres, toho dosáhneme zadáním pouze 1,2,3 skupin adres (standartní IPv4 adresy obsahují čtyři skupiny čísel) deny from xxx.xxx.xxx.xxx Kde xxx.xxx.xxx.xxx znamená IP adresu pokud chceme zahradit přístup všem IP adresám, nahradíme adresy za all. deny from all Pokud chceme přístup do podsložky allow from xxx.xxx.xxx.xxx allow from all Protože pomocí.htaccess můžeme dávat různým lidem různá práva, tyto pravidla je možno kombinovat. order allow,deny deny from xxx.xxx.xxx.xxx allow from all Tento kód znamená, že zakážeme přístup z xxx..., ale všem ostatním jej povolíme, opačný postup můžeme použít například při přístupu na náš server z internetu, kdy nechceme, aby nám na localhost chodili a prohlíželi si ho lidé. Všechna omezení ale neplatí pro skripty, například PHP, což můžeme dobře využít. 7.2.5 Ochrana souboru.htaccess, a to tak, že do něj vložíme následující pravidlo: <Files.htaccess> order allow,deny deny from all </Files> 7.2.6 Seřazení seznamu Můžeme řadit podle jména, od A po Z (dle abecedy) - vzestupně a sestupně: IndexOrderDefault Ascending Name IndexOrderDefault Descending Name Místo Name, což znamená jméno souboru, můžeme doplnit ještě Size=velikost souboru date=datum souboru description=popis souboru. 2012-09-13 Autentizace a autorizace 7/10
7.2.7 Přesměrování Dále můžeme pomocí.htaccess přesměrovávat na jiné soubory nebo složky, to znamená, zadámeli do kolonky prohlížeče adresu x, bude jej server hledat na adrese y, praktický příklad: Redirect /cesta_souboru-slozky http://www.domena.tld/nova_cesta_souboru-slozky První adresa je adresa vzhledem ke kořenové složce, druhá už je vzhledem ke globální síti. 7.2.8 Nastavení indexového souboru Pomocí.htaccess můžeme ještě například změnit indexovaný soubor, tedy index.htm, php na ahoj.htm, hp, ale i přidávat koncovky jako například.jpg a pod. Toho docílíme, že do souboru přidáme: DirectoryIndex index.php index.html index.php ahoj.php ahoj.png cau.php Přitom platí, že na server bude hledat soubory postupně z leva doprava, to znamená, že soubor na levé straně má větší váhu, než ten na pravé, server bude postupně hledat tak, že pokud nenalezne soubor se jménem, které je uvedeno na levé straně, bude postupovat dále napravo. 7.2.9 Autorizovaný přístup Celkově se toto pravidlo skládá ze dvou souborů, a to.htaccess a.htpasswd, v prvním je pravidlo, ve druhém jsou uživatelské jména a hesla. Příklady:.htaccess AuthUserFile /cesta k souboru.htpasswd AuthGrouFile /dev/null AuthName "jmeno" AuthType Basic require valid-user.htaccess AuthName "Moje" AuthType Basic AuthUserFile /www/3/site19183/log/.htpasswd Require user lenka... nebo... valid-user Soubor.htpasswd se doporučuje zadat do kořenové složky, protože tam bývá nejlépe chráněn, pokud tuto cestu neznáme, můžeme ji zjistit pomocí funkce phpinfo(), konkrétně řádek SCRIPT_FILENAME, kde samozřejmě musíme upravit koncové údaje, jde zde pouze pro určení adresy na serveru! Jako jméno uvedeme jméno této chráněné složky, kódování Basic, místo valid-user můžeme napsat: require user petr,lenka,hanka a stránky jsou pak přístupné pouze vyjmenovaným uživatelům. Do souboru.htpasswd uvedeme jména a hesla v následovném seskupení: uzivatelskejmeno:heslo uzivatelskejmeno2:heslo2...:... 2012-09-13 Autentizace a autorizace 8/10
.htpasswd lenka:$1$l60.ko0.$1ka94dxov61wclvafyjcq1 pavel:$1$h/1.wg..$36jmrd0tjpjr8ngz2k6oh0 Příklad programu na přidání nového uživatele: newuser.php if ((isset($_post['user'])) and (isset($_post['heslo']))) { $heslo = Crypt($_POST['heslo']); $data = $_POST['user'].":$heslo\n"; ($fp = FOpen("./.htpasswd","a")) or die ("soubor se nepodařilo otevřít"); FWrite($fp, $data) or die("nepodařilo se zapsat"); FClose($fp); echo "Nový uživatel $data úspěšně uložen!"; else { <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>zadání uživatelů</title> <meta http-equiv=content-type content="text/html; charset=windows-1250"> </head> <body> <form method="post" action="./index.php"> Nový uživatel Uživatel <input type="text" name="user"> Heslo <input type="password" name="heslo"> <input type="submit" value="přidat"> </form> </body> </html>.htaccess AuthName "Moje" AuthType Basic AuthUserFile /www/3/site19183/log/.htpasswd Require user lenka... nebo... valid-user ErrorDocument 403 /spatneheslo.html.htpasswd lenka:$1$l60.ko0.$1ka94dxov61wclvafyjcq1 pavel:$1$h/1.wg..$36jmrd0tjpjr8ngz2k6oh0 2012-09-13 Autentizace a autorizace 9/10
Vytvoření souboru.htpasswd: if(isset($jmeno) && isset($heslo)){ // $heslo=crypt($heslo); $data=$jmeno.":".$heslo."\n"; echo $data; $fo=fopen("tajne/.htpasswd","a"); fwrite($fo,$data); fclose($fo); <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="pspad editor, www.pspad.com"> <title></title> </head> <body> <center> <form action="prihlaseni.php" method="post"> Jméno: <input type="text" name="jmeno" size="30"><br> Heslo: <input type="password" name="heslo" size="30"><br> <input type="submit" value="odešli"> </form> </center> </body> </html> 8 AUTENTIZACE V SERVERU APACHE Do konfiguračního souboru httpd.conf doplníme nastavením Directory: <Directory "cesta/do/adresare"> AuthType Basic AuthName "Jmeno stránek - zabezpečení" AuthUserFile /www/3/site19183/log/hesla.uzivatele Require lenka, petr, pavel </Directory> 2012-09-13 Autentizace a autorizace 10/10