530 likes | 715 Views
Aplikační programové vybavení. Webové aplikace. Webová aplikace. Rozdíly oproti webové stránce : interaktivní řádově vyšší počet požadavků práce s datovým skladem problémy se souběhem více uživatelů Webová aplikace se skládá z webových stránek Webová aplikace je serverová aplikace
E N D
Aplikační programové vybavení Webové aplikace
Webová aplikace • Rozdíly oproti webové stránce: • interaktivní • řádově vyšší počet požadavků • práce s datovým skladem • problémy se souběhem více uživatelů • Webová aplikace se skládá z webových stránek • Webová aplikace je serverová aplikace • zahltit server není problém • zahltit server znamená odříznutí všech uživatelů
Webová aplikace • Rozdíly oproti lokální (nesíťové) aplikaci • vzdálený přístup • problémy se souběhem více uživatelů • potíže s uchováváním stavu • závislost na webových prohlížečích • vysoká dostupnost • levnější údržba aplikace
Metadata • Nastavení dat v HTTP hlavičkách: • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8;language=cs"> • nastavení ukládání do cache (mezipaměti) • Nastavení informací pro vyhledávače a prohlížeče: • klíčová slova (keywords) • autor (author) • popis (description) • <meta name=‘kewords’ content="html, sql, php"> • Při nastavování těchto metadat je nutné brát v úvahu, že vyhledávače se brání ovlivňování výsledků. • pro webové aplikace není příliš významné
Webová stránka z pohledu serveru http://mendelu.cz/ http://mendelu.cz/cz http://mendelu.cz/css/rs_base.css http://mendelu.cz/css/jquery/jquery.fancybox-1.2.5.css http://mendelu.cz/img.pl?rscss=86 http://mendelu.cz/js/jquery/jquery.js http://mendelu.cz/css/rs/galerie_pas.css http://mendelu.cz/js/jquery/jquery.fancybox-1.2.5.js http://mendelu.cz/js/rs/galerie_pas.js http://mendelu.cz/img.pl?rsunid=52494 http://mendelu.cz/img.pl?rsunid=52239 http://mendelu.cz/img.pl?rsunid=52257 http://mendelu.cz/img.pl?rsunid=52251 http://mendelu.cz/img.pl?rsunid=52246 http://mendelu.cz/img.pl?rsunid=52241 http://mendelu.cz/img.pl?rsunid=52309 http://mendelu.cz/img.pl?rsunid=52299 http://mendelu.cz/img.pl?rsunid=53312 http://mendelu.cz/img.pl?rsunid=52247 http://mendelu.cz/rs/obrazek.pl?id=4181;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=3463 http://mendelu.cz/img.pl?rsunid=52262 http://mendelu.cz/rs/obrazek.pl?id=4192;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4198;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4200;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4201;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4202;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4203;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4204;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4182;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4184;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4183;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4185;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4186;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4187;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4189;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4190;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4191;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4193;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4194;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4195;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4196;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4197;nahled=1; http://mendelu.cz/rs/obrazek.pl?id=4199;nahled=1; http://www.google-analytics.com/ga.js http://mendelu.cz/rs/obrazek.pl?id=4188;nahled=1; http://www.google-analytics.com/__utm.gif?utmwv=4.6.5&utmn=1111052810&utmhn=mendelu.cz&utmcs=iso-8859-2&utmsr=1920x1200&utmsc=32-bit&utmul=cs&utmje=1&utmfl=10.0%20r45&utmcn=1&utmdt=MENDELU&utmhid=1707450468&utmr=-&utmp=%2Fcz&utmac=UA-7734192-1&utmcc=__utma%3D109547801.1087977834.1270485352.1270485352.1270485352.1%3B%2B__utmz%3D109547801.1270485352.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B http://mendelu.cz/favicon.ico http://mendelu.cz/img.pl?sysid=fancy_shadow_n http://mendelu.cz/img.pl?sysid=fancy_shadow_ne http://mendelu.cz/img.pl?sysid=fancy_shadow_e http://mendelu.cz/img.pl?sysid=fancy_shadow_se http://mendelu.cz/img.pl?sysid=fancy_shadow_sw http://mendelu.cz/img.pl?sysid=fancy_shadow_s http://mendelu.cz/img.pl?sysid=fancy_shadow_w http://mendelu.cz/img.pl?sysid=fancy_shadow_nw 56 HTTP požadavků
Síťová aplikace mendelu.cz embarcadero.com rychlost závisí na neovlivnitelných okolnostech fyzikální omezení přenosu
Deziluze na úvod POST https://example.com/loginProcess HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: example.com Content-Length: 131 Connection: Keep-Alive Cache-Control: no-cache Accept-Language: cs loggedURL=http%3A%2F%2Fexample.com%2Fticket&serviceId=email&forceSSL=0&username=mrkvicka&domain=example.com&password=cibulka&js=1
Cache • Cache = mezipaměť • Při prvním požadavku na webovou stránku je nutné načíst všechny externí soubory. • obrázky, styly, skripty (klientské) • Při dalším požadavku na stránku není nutné stahovat soubory znovu – pravděpodobně se nezměnily. • Cache je dočasná paměť pro uložení webových stránek. • dramatické zvýšení rychlosti načítání • pevný disk nebo RAM • Existuje také sdílená cache – velké organizace, někteří poskytovatelé internetu
HTTP cachování • Systém pro definovaní doby uchovávání stránky (lifetime, time-to-live, ttl) v cache prohlížeče. • První načtení stránky: • 55 požadavků (435 954 B z toho 18872 B stránka) • Druhý požadavek na stránku: • 9 požadavků (2175 B) • Obnovení stránky: • 54 požadavků • http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
HTTP cachování • Hlavička Cache-control • Cache-control: public, max-age=259200 • Cache-control: private, max-age=3600, must-revalidate • Cache-control: private, no-cache, no-store, must-revalidate • Koncept 1 • soukromý vs. veřejný obsah (public × private × no-cache× no-store) • rozhoduje zda uložit nebo neuložit
HTTP cachování • Koncept 2 – vypršení (expiration) • doba platnosti [s]: • max-age=3600 • povinné ověření: • must-revalidate • Koncept 3 – ověření platnosti • Pokud klient požaduje zaručeně čerstvou stránku může odeslat hlavičku (CTRL + F5): • Pragma: no-cache • Server musí buď odpovědět platnou stránkou nebo klienta přesvědčit, že jeho verze je platná (HTTP status 304).
Ověření platnosti • Podle data poslední změny • Server může odeslat hlavičku udávající poslední změnu souboru: • Last-Modified: Wed, 13 Oct 2004 09:43:02 GMT • Klient může ověřit zda došlo ke změně posláním hlavičky: • If-Modified-Since: Wed, 13 Oct 2004 09:43:02 GMT • Podle obsahu • Server může odeslat kód, který se změní při změně obsahu: • ETag: "3fe48-527f-52237c0" • Klient může ověřit zda došlo ke změně posláním hlavičky: • If-None-Match: "38cac-1f34-7333bcc0"
Nastavení cache • Minimalizace objemu přenášených dat mezi serverem a klientem • Ověření platnosti = přenos přibližně 500B • Pro statický obsah je zajištěno automaticky (posílá se Last-modified) • Pro dynamický obsah nutno řešit při generování stránky (ETag) • zejména pro skripty, které vracejí obrázky a velké soubory • U dynamicky generovaných stránek je vhodné zajistit, aby se generovaly jen pokud je to nutné. • snížení zátěže serveru • http://www.fiddlertool.com/
Udržování stavu • přihlášení, stav formuláře, aktuální stránka… • protokol HTTP je nestavový • Z pohledu serveru není mezi jednotlivými požadavky klientů žádná spojitost. • Jedna akce uživatele odpovídá mnoha HTTP požadavkům. • Požadavky jednotlivých klientů se na serveru prolínají. • Udržování stavu webové aplikace je možné několika způsoby. • všechny jsou špatné • a některé ještě horší…
Identifikace podle IP adresy Map of the internet (2006) http://xkcd.com/195/ • většina PC nemá statickou IP adresu • většinu PC používá více jak jeden uživatel • na většině PC je spuštěn více jak jeden program
GET • GET je základní HTTP požadavek • Udržování stavu metodou GET znamená vkládání parametrů do URL. • Není nijak zabezpečeno, adresu je možné podstrčit • Pouze malý objem textových dat (2 048B), bez speciálních znaků (funkce urlencode() ) • K předávání dochází pouze při kliknutí na odkaz nebo odeslání formuláře. • Uživatel může libovolně měnit • http://www.google.cz/search?q=test&hl=cs&start=10&sa=N
POST • POST je jiný způsob odeslání HTTP požadavku, při kterém klient odesílá (post) serveru data. • POST požadavek vzniká pouze při odeslání formuláře (method='post')neboJavaScriptem. • Není nijak zabezpečeno. • Data jsou ve zdrojovém kódu HTML stránky. • Pouze textová data bez speciálních znaků (urlencode()) • Je mírně odolnější proti podstrčení a proti změně ze strany uživatele. • Není univerzální, musí se explicitně zopakovat při každém požadavku.
Cookie • Data pro udržení stavu se ukládají v prohlížeči • nespolehlivé • uživatel může libovolně mazat a měnit • nebezpečné • není šifrováno • přístupné komukoliv • Nastavuje sevypršení cookie souboru • po zavření prohlížeče (dočasný cookie v RAM) • doba platnosti (tj. platné i po zavření prohlížeče, trvalý cookie na HDD) • Do cookie se dají ukládat jen textová data (max. 4096B na doménu), přenáší se při každém požadavku automaticky.
Příklad Cookie • Internet Explorer • %USERPROFILE%\Cookies • Firefox • %USERPROFILE%\Data aplikací\Mozilla\Firefox\Profiles\hash.default\cookies.txt • Opera • %USERPROFILE%\Data aplikací\Opera\Opera\Profile\cookies4.dat • Internet Explorer (www.google.cz): PREF ID=e0e8437d79da2a4e:LD=en:NR=30:TM=1196797760:LM=1196797793:S=I1OK7fzaFXPVH5SQ google.cz/ 1536 3355346560 30045265 3381481456 29898414 *
Session (sezení) • Data pro uchování stavu se ukládají na serveru. • Vzniká problém identifikace klienta • Automatická správa session: • při prvním požadavku server generuje identifikační kód session • vytvoří prostor pro data • identifikační kód zašle klientovi • klient uloží kód do dočasného cookie souboru • s každým požadavkem zašle klient serveru kód session
Session (automatická) • Umožňuje ukládání větších objemů dat i netextových dat. • Data jsou uložena na serveru a přístupná pouze webovému serveru. • Přenáší se pouze identifikační kód (SESSION ID). • Slabým místem je identifikační kód • identifikační kód je možno zcizit nebo podstrčit (session fixation) • po zapomenutí kódu (zavření prohlížeče) je session nepřístupná • Nejpoužívanější způsob ukládání stavu webových aplikací.
Session (automatická) a Web 2.0 • viz příloha • http://akela.mendelu.cz/~xpopelka/cs/apv/ost/session-soubory.pdf • http://akela.mendelu.cz/~xpopelka/cs/apv/ost/session-databaze.pdf • Uchování stavu je nutná podmínka k realizaci zabezpečení
Bezpečnost webové aplikace • Problém 1: • uživatel • Problém 2: • uchování stavu přihlášení, zabránění zcizení stavu • Problém 3: • zabezpečení jména a hesla • Problém 4: • kontrola uživatelských vstupů
Heslo – osvěta • Jméno kočičky není dobré heslo • tedy pokud se kočička nejmenuje XdTg42W • Jakékoliv heslo složené ze slov je slabé • Jakékoliv heslo napsané na nástěnce je slabé • Čím častěji je heslo použité tím je slabší • Pro každou aplikaci musí být jiné heslo → KeePass • Pro srovnání: • slušný jazyk = 250 000 slov • 8 míst = 6 553 600 000 000 kombinací • 10 míst = 10 485 760 000 000 000 kombinací
Přihlášení • autentizace – authentication – ověření identity uživatele • autorizace - authorization – ověření oprávnění uživatele • autentification – zkomolenina authentication • 4 způsoby ověření identityuživatele: • co víte (heslo) • co máte (klíč, certifikát – velmi dobré) • kdo jste (otisk prstu – nepřesné) • co děláte (hlasu, rukopisu – napodobitelné) • 2F (two-factor) ověřování
Přenos hesla • Heslo je možné zadat do HTML formuláře • Odesílá se nešifrované (plaintext) v POST požadavku. • Odposlechnutí hesla je jednoduché. • Podstrčení formuláře je jednoduché. • Pro přihlášení je možné využít přihlášení protokolu HTTP • Odposlechnutí hesla je složitější
Přihlášení formulářem • Při přihlášení přes webový formulář se posílá heslo jednorázově (při odeslání formuláře) • po ověření hesla musí server uchovávat stav přihlášení • problém identifikace klienta • různé metody verifikace • kontrolní kódy, časově omezené kódy • není spolehlivé
Request POST https:// example.com /loginProcess HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: example.com Content-Length: 131 Connection: Keep-Alive Cache-Control: no-cache Accept-Language: cs loggedURL=http%3A%2F%2Femail.example.com%2Fticket&serviceId=email&forceSSL=0&username=mrkvicka&domain= example.com &password=cibulka&js=1
HTTP Přihlášení • Při přihlášení pomocí HTTP se heslo odesílá při každém požadavku • je možné uchovávat stav přihlášení • nebo je možné ověřovat jméno a heslo při každém požadavku • heslo je mnohočetným přenosem oslabováno • je nutné kombinovat s šifrováním • umožňuje ukládání Session do databáze • odpadá problém identifikace klienta • 2. nejbezpečnější způsob 1F přihlašování (hned po přihlášení osobním certifikátem)
HTTP Přihlášení • 2 základní varianty: • basic • jednoduché ověřování • heslo se posílá nešifrované • digest • komplexní dvoustranné ověřování • heslo se nikdy neposílá plaintextově • umožňuje ověření integrity stránky • ověřování každého přístupu • braní se opakování požadavku • složitá implementace
HTTP Basic Auth - Request 1 GET /eyen2/ HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: cs UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Host: example.com Connection: Keep-Alive
HTTP Basic Auth - Odpověd 1 HTTP/1.1 401 Unauthorized Date: Thu, 16 Apr 2009 08:26:07 GMT Server: Apache X-Powered-By: PHP/5.1.6 Set-Cookie: PHPSESSID=05pbojjjidmtu8s94avgp3djo0; path=/ Last-Modified: Thu, 16 Apr 2009 08:26:07 GMT Cache-control: private, no-cache, no-store, must-revalidate Set-Cookie: PHPSESSID=f2rsf9ijsfk97vmifk4pkpajt1; path=/ WWW-Authenticate: Basic realm="Eyen - Amadeo installer" status: 401 Unauthorized Content-Length: 1039 Keep-Alive: timeout=15, max=64 Connection: Keep-Alive Content-Type: text/html;charset=utf-8;language=cs
HTTP Basic Auth - Request 2 GET /eyen2/ HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: cs UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Cookie: PHPSESSID=f2rsf9ijsfk97vmifk4pkpajt1 Connection: Keep-Alive Host: example.com Authorization: Basic bG9naW46bW9qZXRham5laGVzbG8=
Kde je heslo? • base64_decode(‘bG9naW46bW9qZXRham5laGVzbG8=‘); • login:mojetajneheslo
HTTP Digest Auth – Request 1 GET /eyen/ HTTP/1.1 Accept: */* Accept-Language: cs UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Host: example.com Connection: Keep-Alive Pragma: no-cache Cookie: PHPSESSID=3cf24mkcm3u6mb91m65aah8s90
HTTP Digest Auth – Response 1 HTTP/1.0 401 Unauthorized Date: Thu, 16 Apr 2009 08:33:28 GMT Server: Apache/2.2.10 (Win32) DAV/2 mod_ssl/2.2.10 OpenSSL/0.9.8i SVN/1.5.4 PHP/5.2.7 X-Powered-By: PHP/5.2.7 Last-Modified: Thu, 16 Apr 2009 08:33:28 GMT Cache-control: private, no-cache, no-store, must-revalidate WWW-Authenticate: Digest realm="EyenInstaller", qop="auth", nonce="cbf80c608e0ba3bfcaf8ec4d1f3ea0cc", opaque="ceef418ef038687855e6755e91d68b01" Content-Length: 1557 Connection: close Content-Type: text/html;charset=utf-8;language=cs
HTTP Digest Auth – Request 2 GET /eyen/ HTTP/1.1 Accept: */* Accept-Language: cs UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Cookie: PHPSESSID=3cf24mkcm3u6mb91m65aah8s90 Connection: Keep-Alive Pragma: no-cache Authorization: Digest username="login",realm="EyenInstaller",nonce="cbf80c608e0ba3bfcaf8ec4d1f3ea0cc",uri="/eyen/",cnonce="757efac677e3fe31bb5e4744b212822f",nc=00000001,response="8699a023df2dc7205f51c29a35ad51e0",qop="auth",opaque="ceef418ef038687855e6755e91d68b01" Host: 192.168.1.123
HTTP Digest Auth • nonce – token unikátní pro každé přihlášení • cnonce – unikátní token generovaný klientem • nc – počet použití nonce • response – • $a1_hash = md5($user_name.":".SYS_REALM.":".$password) • $a2_hash = md5($_SERVER['REQUEST_METHOD'].":". $digest['uri']); • $response = md5($a1_hash.":".$digest['nonce'].":". $digest['nc'].":".$digest['cnonce'].":".$digest['qop'].":".$a2_hash); • qop – auth/auth-int – přihlášení/přihlášení + verifikace poslaného obsahu • opaque – kontrolní kód • $opaque = md5(uniqid(rand(), true).SYS_REALM) • http://www.ietf.org/rfc/rfc2617.txt
Šifrování • Šifrovaný přenos je možný pomocí protokolu HTTPS • Funguje jako obálka protokolu HTTP. • Při šifrovaném přenosu zbývá zabránit podstrčení stránky • K ověření pravosti stránky slouží certifikáty • certifikát musí být platný • certifikát musí být vydán pro aktuální server • certifikát musí být ověřen certifikační autoritou • certifikační autorita musí být pravá
Certifikáty • Cílem certifikátu je ověřit pravost subjektu • Každý certifikát musí ověřit certifikační autorita. • Existují i self-signed certifikáty pro testovací účely
Uchování hesla • Pokud se přidá salt, pak prakticky stačí použít jednosměrný kódovací algoritmus • sha1, md5, tth, atd... • dekódování je natolik náročné, že se útočník raději zaměří na jinou část aplikace • Bezpečnější je použít (jednosměrný) šifrovací algoritmus. • Vyžaduje uchování/generování klíče. • Hesla by měla být uložena v DB s vhodně nastavenými oprávněními.
Bezpečnost Aby byl šifrovaný přenos bezpečný, musí být platné certifikáty. Heslo musí být silné, jinak se dá uhádnout a žádné zabezpečení nepomůže. Uživatel musí být ostražitý. 2F zabezpečení je úplně někde jinde než 1F zabezpečení. 2F zabezpečení není zadaní dvou hesel!
Ošetření uživatelských vstupů • Ošetření speciálních znaků při vkládání dat do databáze (pg_escape_string()) • SQL injection • uvozovky, znak #0 • podle DB serveru případně i další • Ošetření speciálních znaků při zobrazování stránky na webu (html_special_chars()) • Cross site scripting (XSS) • HTML značky • Skripty na straně klienta