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)): echo "$hlavicka - $obsah
"; endwhile;
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 *
tato hlavička obsahuje informace o typech dat podporovaných klientem. Při každém type Accept: text/html, image/gif; q= můžeme ještě určit akceptovatelnost parametrem 0,4 e/png; q=0.2 q, od nuly do jedna. Např. q=0.5 je lepší jako q=0.2.
Accept-Charset *
Můžeme určit, které znakové sady podporuje náš prohlížeč. Obsahuje také parametr q.
Accept-Charset: windows-1250; q=0.7, us-ascii; q=0.3
Accept-Language *
Touto hlavičkou můžeme sdělit serveru, jaký jazyk preferujeme.
Accept-Language: cs, en; q=0.4
From
Hlavička obsahující elektronickou adresu uživatele, kvůli ochraně údajů už dnes nejsou prohlížeči moc podporované
$HTTP_FROM;
Host
Táto hlavička obsahuje doménovou adresu uživatele.
$HTTP_HOST;
If-Modified-Since
Jestliže chceme dokument dostat, jen když byl od If-Modified-Since: Fri, 22 Jun daného data změněný 2001 17:04:05 GMT
Referer
Tato hlavička obsahuje url stránky, odkud přišel uživatel, tedy referera. Velmi užitečná a oblíbená $HTTP_REFERER; hlavička.
User-Agent
User-Agent posílá identifikaci prohlížeče, tedy jméno, číslo verze, a platformu, na které je spuštěný.
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01, Windows NT)
Location
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://
Location: http://interval.cz/
Server
Server posílá svoji identifikaci, jméno a verzi
Server: Apache/1.4b2
Content-Type
Hlavička obsahuje typ dat, např. text/html HTML, text - text/plain, obrázok - Gif image/gif, ...
Content-Type: text/html
Expires
Určujeme, po jakou dobu bude odpověď platná. Když uvedeme jako parametre aktuální čas, dokument se nebude ukládat do cache paměti.
Expires: Fri, 22 Jun 2001 17:18:17 GMT
Last-Modified
Táto hlavička obsahuje datum poslední $HTTP_LAST_MODIFIED modifikace dokumentu poslaného jako odpověď.
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:
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
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
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:
order allow,deny deny from all
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
Zadání uživatelů <meta http-equiv=Content-Type content="text/html; charset=windows-1250">
.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: <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com">
8 AUTENTIZACE V SERVERU APACHE Do konfiguračního souboru httpd.conf doplníme nastavením Directory:
AuthType Basic AuthName "Jmeno stránek - zabezpečení" AuthUserFile /www/3/site19183/log/hesla.uzivatele Require lenka, petr, pavel
2012-09-13
Autentizace a autorizace
10/10