• No results found

PrettyFaces

In document SQL TESTER (Page 32-0)

PrettyFaces je open-source ˇreˇsen´ı pro pˇrepisov´an´ı URL v JSF aplikac´ıch. Pˇrepisov´an´ı na hezky ˇcitelnou URL se hod´ı pˇredevˇs´ım pro SEO (Search Engine Optimization), tedy opti-malizaci pro vyhled´avaˇce. Konfigurace se nach´az´ı v souboru pretty-config.xml. Pˇr´ıkladem pˇreps´an´ı URL m˚uˇze b´yt zmˇena adresy z /sqltester/public/login/form.xhtml na /sqltes-ter/login. Doc´ıl´ıme toho pomoc´ı n´asleduj´ıc´ı konfigurace.

<url-mapping id="login">

<pattern value="/login" />

<view-id value="/public/login/form.xhtml" />

</url-mapping>

Dalˇs´ı zp˚usoby vyuˇzit´ı m˚uˇzeme nal´ezt na ofici´aln´ıch str´ank´ach [15].

6.4 Sablona ˇ

Pro modern´ı dynamick´e aplikace je samozˇrejmost´ı vyuˇzit´ı ˇsablon. Do glob´aln´ı ˇsablony v aplikaci spad´a z´ahlav´ı s menu, ˇc´ast pro obsah a z´apat´ı. Do hlaviˇcky se vˇzdy vkl´ad´a titulek a do obsahu se vkl´ad´a cel´e tˇelo str´anky. V ˇsablonˇe s n´azvem template.xhtml se vkl´ad´a obsah n´asledovnˇe.

<ui:insert name="content" >Content</ui:insert>

Pot´e vytvoˇr´ıme str´anku, kter´a tuto ˇsablonu bude vyuˇz´ıvat.

<ui:composition template="/WEB-INF/layout/template.xhtml">

A nakonec vloˇz´ıme obsah na patˇriˇcn´e m´ısto.

<ui:define name="content" ></ui:define>

Niˇzˇs´ı ´uroveˇn ˇsablon je dle m´eho n´azoru samotn´e dynamick´e vkl´ad´an´ı obsahu z datab´aze tedy napˇr´ıklad n´asleduj´ıc´ı k´od.

<h:outputText value="#{user.surname}" />

6 VIEW

6.5 Chybov´ e str´ anky

K profesion´aln´ı aplikaci urˇcitˇe patˇr´ı vytvoˇren´ı vlastn´ıch chybov´ych str´anek, kter´e maj´ı uˇzivatele informovat o chybˇe a nab´ıdnout mu cestu na funkˇcn´ı str´anku. Chyba vˇzdy obsa-huje stavov´y k´od protokolu HTTP a popis stavu. K´ody zaˇc´ınaj´ıc´ı ˇc´ıslic´ı 1 jsou informaˇcn´ıho charakteru, 2 znamen´a ´uspˇeˇsn´e zpracov´an´ı poˇzadavku, 3 pˇresmˇerov´an´ı, 4 klientsk´e chyby a 5 serverov´e chyby. ˇCasto se vytv´aˇr´ı vlastn´ı str´anky alespoˇn pro n´asleduj´ıc´ı k´ody a i j´a jsem je vytvoˇril. Uk´azka str´anky se nach´az´ı v pˇr´ıloze J.

• 401 – Selh´an´ı autentizace nebo autorizace, napˇr´ıklad ˇspatn´e pˇrihlaˇsovac´ı ´udaje.

• 403 – Pˇr´ıstup zam´ıtnut, uˇzivatel napˇr´ıklad nem´a dostateˇcn´a opr´avnˇen´ı zobrazit ob-sah.

• 404 – Str´anka nenalezena, zadan´a URL neodkazuje na existuj´ıc´ı zdroj.

• 500 – Intern´ı chyba serveru, neoˇcek´avan´a chyba pˇri zpracov´an´ı dotazu na stranˇe serveru.

• 503 – Nedostupn´a sluˇzba, napˇr´ıklad je server v ´udrˇzbˇe.

6.6 Resources

Ke kaˇzd´e webov´e aplikaci patˇr´ı kromˇe HTML tak´e dalˇs´ı soubory jako CSS, javascript, obr´azky apod. Pro uloˇzen´ı tˇechto soubor˚u slouˇz´ı sloˇzka resources. J´a osobnˇe dˇel´ım tuto sloˇzku d´ale jeˇstˇe na sloˇzky css, js, images, icons a fonts. Mezi CSS m´am kromˇe ˇc´asti vlastn´ıho vzhledu i CSS knihovnu Twitter Bootstrap. S jej´ı pomoc´ı jsem vytvoˇril napˇr´ıklad i z´ahlav´ı str´anky, ve kter´em se nach´az´ı hlavn´ı menu. Uk´azka z´ahlav´ı je na obr´azku 7.

Obr´azek 7: Z´ahlav´ı str´anky s logem a menu

Ve sloˇzce js se nach´az´ı javascriptov´e soubory. Musel jsem v nˇekter´ych pˇr´ıpadech trochu poupravit chov´an´ı JSF a PrimeFaces komponent. Jedn´a se o frameworky, kter´e mus´ı b´yt univerz´aln´ı a tud´ıˇz ne vˇzdy n´am mus´ı vyhovovat jejich z´akladn´ı funkcionalita. D´ale jsem

6 VIEW

vytvoˇril tlaˇc´ıtko pro rychl´y n´avrat na zaˇc´atek str´anky a tak´e jsem pomoc´ı javascriptu vyˇreˇsil lokalizaci chybov´ych str´anek, protoˇze odesl´an´ı nov´eho dotazu pro zmˇenu jazyka by smazalo pˇredchoz´ı chybov´y stav. V aplikaci se nach´az´ı nˇekolik obr´azk˚u. K vytvoˇren´ı favikony jsem vyuˇzil gener´ator [7]. K vytvoˇren´ı loga jsem vyuˇzil n´astroj [5], pˇriˇcemˇz jsem jej upravil v grafick´em editoru Gimp a pro textovou ˇc´ast loga jsem vyuˇzil bezplatn´eho fontu Roboto. Vlajeˇcky pro zmˇenu jazyka jsem pˇrevzal ze zdroje [1]. Ikonky pro export statistik jsem vytvoˇril s´am. Posledn´ı obr´azek se nach´az´ı ve spouˇstˇen´ı dotaz˚u a pˇredstavuje datab´azi. Najdeme jej i v pˇr´ıloze I. Ten mi vytvoˇrila ˇsikovn´a grafiˇcka Monika Jarol´ımov´a, kter´a mi rovnˇeˇz dala nˇekolik cenn´ych rad ohlednˇe celkov´eho vzhledu a pomohla mi vytvoˇrit sch´emata do t´eto zpr´avy. Za to j´ı t´ımto dˇekuji. Vˇsechny obr´azky je moˇzn´e vyuˇz´ıt pro soukrom´e i komerˇcn´ı ´uˇcely bez nutnosti uv´adˇet p˚uvod obr´azk˚u.

6.7 Lokalizace

Do aplikace jsem integroval moˇznost volby jazyka. Jako prim´arn´ı jazyk je nastaven´a ˇceˇstina.

D´ale je moˇzn´e rozhran´ı pˇrepnout do slovenˇstiny a angliˇctiny. Jsou to jazyky, do kter´ych jsem byl schopn´y ˇcesk´y text pˇreloˇzit. Nicm´enˇe d´ıky jiˇz hotov´e implementaci pˇrep´ın´an´ı jazyk˚u je pˇrid´an´ı dalˇs´ıho jazyka pomˇernˇe jednoduch´e. Tato moˇznost by se mohla vyuˇz´ıt zejm´ena, pokud bychom se rozhodli v budoucnu aplikaci zpˇr´ıstupnit veˇrejnosti. Na obr´azku 8 vid´ıme v z´apat´ı str´anky vlajeˇcky. Pod´ıv´ame se, jak se takov´a lokalizace v JSF vytv´aˇr´ı.

Obr´azek 8: Z´apat´ı str´anky s vlajeˇckami

Vytvoˇr´ıme ve sloˇzce resources takzvan´y message bundle. Jedn´a se o soubory s n´azvy messages_cs.properties, messages_sk.properties a messages_en.properties. Samozˇrejmˇe se jedn´a o jinou sloˇzku resources, neˇz se kterou jsme se setkali v kapitole 6.6. V kaˇzd´em souboru je uveden kl´ıˇc a k nˇemu hodnota. V aplikaci jako takov´e potom pouˇzijeme kl´ıˇc, za kter´y se dosad´ı hodnota z pˇr´ısluˇsn´eho souboru podle pr´avˇe zvolen´eho jazyka.

MENU_TOOLS=Nastaven´ı MENU_TOOLS=Nastavenie MENU_TOOLS=Tools

6 VIEW

Message bundle je potˇreba zaregistrovat v konfiguraˇcn´ım souboru faces-config.xml a vy-tvoˇrit session objekt pro udrˇzov´an´ı a zmˇenu aktu´aln´ıho jazyka. Zde je uk´azka konfiguraˇcn´ıho souboru.

<locale-config>

<default-locale>cs</default-locale>

<supported-locale>cs</supported-locale>

<supported-locale>en</supported-locale>

<supported-locale>sk</supported-locale>

</locale-config>

<message-bundle>cz.tul.fm.sqltester.locale.messages</message-bundle>

<resource-bundle>

<base-name>cz.tul.fm.sqltester.locale.messages</base-name>

<var>msg</var>

</resource-bundle>

Metoda v objektu pro zmˇenu jazyka do slovenˇstiny m˚uˇze vypadat napˇr´ıklad takto.

public void changeLocaleToSk() { locale = "sk";

FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(locale));

}

7 ZABEZPE ˇCEN´I

7 Zabezpeˇ cen´ı

7.1 HTTPS

HTTPS je protokol, kter´y je podobn´y protokolu HTTP s t´ım rozd´ılem, ˇze pˇren´aˇsen´a data ˇsifruje. V bˇeˇzn´em HTTP se data odes´ılaj´ı v textovˇe ˇciteln´e podobˇe vˇcetnˇe hesel. Samotn´e ˇsifrov´an´ı v HTTPS zajiˇst’uje protokol TLS (Transport Layer Security). Jedn´a se o asyme-trickou ˇsifru, kdy kaˇzd´a strana vlastn´ı priv´atn´ı a veˇrejn´y kl´ıˇc. U serveru je samozˇrejmˇe nutn´e ovˇeˇrit certifik´at. Certifik´at je ovˇeˇren´y certifikaˇcn´ı autoritou a ta je ovˇeˇrena jinou certifikaˇcn´ı autoritou. Koneˇcn´a autorita se naz´yv´a koˇrenov´a certifikaˇcn´ı autorita a jej´ı kl´ıˇc je uloˇzen v uloˇziˇsti, tedy napˇr´ıklad v prohl´ıˇzeˇci.

7.1.1 Certifik´at

Pro vyuˇzit´ı HTTPS je nutn´e vlastnit certifik´at. Jedn´a se o veˇrejn´y kl´ıˇc, kter´y je podepsan´y certifikaˇcn´ı autoritou. Pod´ıv´ame se na postup vytvoˇren´ı certifik´atu pro ˇskoln´ı server, kter´y jsem zajistil. Nejprve je nutn´e vygenerovat kl´ıˇc priv´atn´ı a k nˇemu ˇz´adost o elektronick´y pod-pis. Pot´e je nutn´e vytvoˇrit konfiguraˇcn´ı soubor pro vygenerov´an´ı priv´atn´ıho kl´ıˇce a ˇz´adosti o certifik´at.

Tento soubor nazveme napˇr´ıklad server-req.cfg a bude n´am slouˇzit jako vsutp pro funkci knihovny openssl.

7 ZABEZPE ˇCEN´I

openssl req -new -keyout serverkey.pem -out serverreq.pem -config server-req.cfg

T´ımto pˇr´ıkazem z´ısk´ame priv´atn´ı kl´ıˇc serverkey.pem a ˇz´adost o certifik´at serverreq.pem, kterou odeˇsleme CESNETU pomoc´ı formul´aˇre na str´ance [28]. CESNET zaˇr´ıd´ı certifik´at, kter´y si budeme moci pot´e st´ahnout. Jelikoˇz pouˇz´ıv´ame Javu, je nutn´e priv´atn´ı kl´ıˇc spolu s certifik´atem pˇrev´est do form´atu pro Javu. Jedn´a se o form´at JKS. Pˇr´ım´y pˇrevod z form´atu PEM nefunguje. Je tedy nutn´e pˇrev´est form´at PEM na form´at PKCS12 a ten posl´eze na form´at JKS. Vyuˇzijeme opˇet knihovnu openssl. N´asleduj´ıc´ım pˇr´ıkazem z´ısk´ame form´at PKCS12.

openssl pkcs12 -export -inkey serverkey.pem -in servercert.pem -name nazev -out keystore.p12

Nyn´ı m˚uˇzeme n´aˇs keystore.p12 pˇrev´est na poˇzadovan´y JKS. K tomu slouˇz´ı Java n´astroj KeyTool. Nach´az´ı se v bˇeˇzn´e instalaci Javy. N´asleduj´ıc´ı pˇr´ıkaz pˇrevod zajist´ı.

keytool -importkeystore -srckeystore neystore.p12 -srcstoretype pkcs12 -srcalias nazev -destkeystore keystore.jks

-deststoretype jks -deststorepass heslo -destalias nazev

N´avod˚u jak pˇrev´est form´at PEM na JKS je mnoho, nicm´enˇe po nˇekolika nejr˚uznˇejˇs´ıch po-kusech jsem zjistil, ˇze v´yˇse uveden´y postup je jedin´y skuteˇcnˇe funkˇcn´ı. Soubor n´am poslouˇz´ı pro zprovoznˇen´ı HTTPS na webov´em serveru Tomcat a z´aroveˇn pro zprovoznˇen´ı Shibbo-lethu. V souboru server.xml je nutn´e poupravit ´udaje pro HTTPS. Staˇc´ı odkomentovat jiˇz existuj´ıc´ı konfiguraci a pˇridat cestu k souboru keystore.jks a heslo.

7.2 Spring security

Spring Security je pˇr´ıdavn´a souˇc´ast frameworku Spring. Poskytuje komplexn´ı zabezpeˇcen´ı pro Java EE aplikace. Zabezpeˇcen´ı je konfigurovateln´e a tak si kaˇzd´y m˚uˇze zvolit speci-fickou konfiguraci pro sv˚uj syst´em. Nab´ız´ı napˇr´ıklad funkce pro autentizaci a autorizaci uˇzivatel˚u nebo ochranu pˇred r˚uzn´ymi ´utoky. Autentizace je ovˇeˇren´ı uˇzivatele. Ovˇeˇren´ı prob´ıh´a nejˇcastˇeji prostˇrednictv´ım jm´ena a hesla. Autorizace je ovˇeˇren´ı pr´av uˇzivatele.

Napˇr´ıklad zda m˚uˇze prov´est poˇzadovanou akci. K tomu slouˇz´ı nejˇcastˇeji uˇzivatelsk´e role.

Jako hlavn´ı zdroj informac´ı jsem opˇet vyuˇzil ofici´aln´ı dokumentaci, viz [23].

7 ZABEZPE ˇCEN´I

7.3 Autentizace uˇ zivatel˚ u

Mezi autentizaˇcn´ı mechanismy patˇr´ı napˇr´ıklad n´asleduj´ıc´ı moˇznosti:

• Anonymn´ı ovˇeˇren´ı - Ovˇeˇren´ı anonymn´ıho uˇzivatele ˇz´adnou autentizaci nevyˇzaduje.

Nˇekter´e str´anky v aplikaci je moˇzn´e nechat zobrazit libovoln´emu uˇzivateli.

• HTTP Basic - Jedn´a se metodu, kdy se jm´eno a heslo uˇzivatele uloˇz´ı do cache pamˇeti a odeˇsle se v hlaviˇcce kaˇzd´eho HTTP dotazu. Implementace je zpravidla velice rychl´a, protoˇze prohl´ıˇzeˇce obsahuj´ı vlastn´ı formul´aˇr pro pˇrihl´aˇsen´ı uˇzivatele, nicm´enˇe je nutn´e pˇredpokl´adat zabezpeˇcenou komunikaci mezi klientem a serverem. Tento zp˚usob au-tentizace se vyuˇz´ıv´a napˇr´ıklad u nastaven´ı s´ıt’ov´ych prvk˚u jako jsou routery.

• Formul´aˇrov´e ovˇeˇren´ı - Lepˇs´ı variantou je vytvoˇrit vlastn´ı pˇrihlaˇsovac´ı formul´aˇr, data od uˇzivatele zpracovat a informaci o jeho pˇrihl´aˇsen´ı udrˇzovat na serveru. Pro zajiˇstˇen´ı bezpeˇcnosti je nutn´e vyuˇz´ıt protokol HTTPS.

• LDAP - Jedn´a se o datab´azi se stromovou strukturou. Uˇzivatele a informace o nich ukl´ad´a do adres´aˇrov´e struktury. Ovˇeˇren´ı uˇzivatele v˚uˇci LDAP datab´azi je pomˇernˇe bˇeˇzn´e a pˇr´ıvˇetiv´e. ˇSkola sice LDAP datab´azi vlastn´ı, ale od nˇejak´e doby k n´ı ned´av´a pˇr´ıstup, i kdyˇz si mysl´ım, ˇze by to pro mˇe byla pomˇernˇe dobr´a varianta autentizace uˇzivatel˚u. Konfigurace je ve Spring Security pomˇernˇe jednoduch´a.

• OpenID - Umoˇzˇnuje nechat autentizaci uˇzivatele na extern´ı aplikaci. Extern´ı aplikac´ı m˚uˇze b´yt napˇr´ıklad Google nebo mojeID. Uˇzivatel se tak pˇrihl´as´ı ke sv´emu Google

´

uˇctu a t´ım potvrd´ı svou autenticitu.

• SSO (Single Sign-On) - Jedn´a se o sluˇzbu jednotn´eho pˇrihl´aˇsen´ı. Uˇzivatel se pˇrihl´as´ı na jedn´e jedin´e sluˇzbˇe, ˇc´ımˇz z´ısk´a pˇrihl´aˇsen´ı na vˇsech sluˇzb´ach, kter´e tento mecha-nismus vyuˇz´ıvaj´ı. SSO tvoˇr´ı poskytovatel identity a poskytovatel sluˇzeb. Pˇr´ıkladem m˚uˇze b´yt Shibboleth.

• Zapamatov´an´ı uˇzivatele - Informace o posledn´ım ´uspˇeˇsn´em pˇrihl´aˇsen´ı se uloˇz´ı na lok´aln´ım poˇc´ıtaˇci uˇzivatele do tzv. cookies. Pot´e jiˇz staˇc´ı pˇreˇc´ıst cookie a zjistit, zda m´a uˇzivatel platn´e pˇrihl´aˇsen´ı.

Pro aplikaci SQL tester jsem pro nˇekter´e str´anky zvolil pˇr´ıstup anonymn´ıho uˇzivatele, pro administr´atorsk´y ´uˇcet vyuˇz´ıv´am vlastn´ı formul´aˇr a pro ostatn´ı uˇzivatele Shibboleth. Pˇres

7 ZABEZPE ˇCEN´I

Shibboleth se mohou pˇrihl´asit studenti a uˇcitel´e. Pokud by se aplikace v budoucnu otevˇrela veˇrejnosti, pˇridal bych i OpenID.

7.4 Shibboleth

Shibboleth je open-source projekt, kter´y nab´ız´ı sluˇzbu SSO. Umoˇzˇnuje tedy uˇzivateli po-moc´ı jednoho pˇrihl´aˇsen´ı pˇr´ıstup k v´ıce aplikac´ım. Mezi organizace, kter´e vyuˇz´ıvaj´ı Shib-boleth patˇr´ı pˇredevˇs´ım univerzity. Patˇr´ı mezi nˇe i TUL. SSO syst´em obsahuje celkem 4 prvky.

• Webov´y prohl´ıˇzeˇc – Pˇredstavuje uˇzivatele v r´amci procesu SSO.

• Zdrojov´a data – Obsahuj´ı chr´anˇen´y obsah, kter´y chce uˇzivatel zobrazit.

• Identity Provider (IdP) – Poskytovatel ovˇeˇren´ı, ovˇeˇruje uˇzivatele. Napˇr´ıklad Shibbo-leth.

• Service Provider (SP) – Poskytovatel sluˇzby, dotazuje se IdP na ovˇeˇren´ı. Napˇr´ıklad SQL Tester.

Komunikace a v´ymˇena dat mezi IdP a SP prob´ıh´a prostˇrednictv´ım zpr´av v jazyce SAML (Security Assertion Markup Language). ´Udaje o uˇzivatel´ıch jsou pˇred´av´any ve formˇe meta-dat, coˇz je XML soubor splˇnuj´ıc´ı pr´avˇe SAML standard. Ke komunikaci je rovnˇeˇz potˇreba protokol TLS a metadata mus´ı obsahovat veˇrejn´y kl´ıˇc. K tomu vyuˇzijeme n´aˇs certifik´at, kter´y zajiˇst’uje i HTTPS. Samotn´y SSO proces pak prob´ıh´a v 5 kroc´ıch:

1. Uˇzivatel pˇristupuje ke zdroji - Pokud je v bezpeˇcnostn´ım kontextu aplikace informace o jiˇz pˇrihl´aˇsen´em uˇzivateli, potom je uˇzivateli pˇr´ıstup umoˇznˇen. V opaˇcn´em pˇr´ıpadˇe je poˇzadavek na autentizaci pˇresmˇerov´an na server IdP s c´ılem zah´ajit SSO.

2. Pˇrihl´aˇsen´ı uˇzivatele u IdP - Pokud m´a uˇzivatel u IdP existuj´ıc´ı relaci, pokraˇcuje se dalˇs´ım krokem. V opaˇcn´em pˇr´ıpadˇe ovˇeˇr´ı IdP uˇzivatele prostˇrednictv´ım jm´ena a hesla.

3. IdP pˇripravuje autentizaˇcn´ı odpovˇed’ - Po identifikaci uˇzivatele IdP pˇriprav´ı auten-tizaˇcn´ı odpovˇed’ ve formˇe SAML zpr´avy a odeˇsle ji. Uˇzivatele odeˇsle zpˇet na SP.

7 ZABEZPE ˇCEN´I

4. SP kontroluje autentizaˇcn´ı odpovˇed’ - SP ovˇeˇr´ı odpovˇed’ a zmˇen´ı informace o aktu´alnˇe pˇrihl´aˇsen´em uˇzivateli.

5. Zdroj vrac´ı obsah - Stejnˇe jako v kroku 1 je uˇzivatel ovˇeˇren v˚uˇci bezpeˇcnostn´ımu kontextu. Tentokr´at uˇz je ovˇsem pˇrihl´aˇsen´y a je mu chr´anˇen´y obsah k dispozici.

R´ad bych zm´ınil, ˇze jsem 25. ledna 2015 zveˇrejnil na str´ank´ach Wikipedie ˇcesk´y ˇcl´anek o Shibbolethu, viz [26]. ˇCl´anek jsem pˇridal pod ´uˇctem JakubVenglar. Sepsat ˇcl´anek bylo souˇc´ast´ı z´apoˇctu z pˇredmˇetu Poˇc´ıtaˇcov´a bezpeˇcnost. Jelikoˇz jsem se v bakal´aˇrsk´e pr´aci tou dobou zab´yval Shibbolethem, pouˇzil jsem podobn´y text i pro vytvoˇren´ı ˇcl´anku na Wikipedii. ˇCl´anek na Wikipedii tedy vznikl na z´akladˇe t´eto pr´ace.

7.5 Spring SAML

V kapitole 7.4 jsem zm´ınil, ˇze Shibboleth komunikuje prostˇrednictv´ım protokolu SAML.

Abychom s n´ım mohli komunikovat, vyuˇzijeme knihovnu Spring SAML, kter´a spolupracuje se Spring Security. Zvl´ad´a pˇripojen´ı k IdP, generov´an´ı metadat, z´ısk´an´ı atribut˚u uˇzivatele a vˇse potˇrebn´e k implementaci SSO. V konfiguraˇcn´ım souboru je nutn´e nastavit cestu a heslo k certifik´atu plus metadata IdP, coˇz je v naˇsem pˇr´ıpadˇe Shibboleth. Vyuˇzil jsem kon-figuraˇcn´ıho souboru z uk´azkov´e aplikace [24], kter´y jsem poupravil dle vlastn´ıch poˇzadavk˚u.

7.6 Ochrana proti 10 nejˇ castˇ ejˇ s´ım rizik˚ um podle OWASP

V t´eto kapitole se pokus´ım nast´ınit 10 nejzn´amˇejˇs´ıch bezpeˇcnostn´ıch rizik pro webov´e aplikace. U kaˇzd´eho rizika rovnˇeˇz uv´ad´ım druhy ochran v aplikaci SQL Tester. Vych´azel jsem ze seznamu organizace OWASP [14].

7.6.1 SQL Injection

SQL Injection je technika, kdy ´utoˇcn´ık pomoc´ı formul´aˇre modifikuje vykon´avan´y SQL dotaz a pˇrid´a do nˇej vlastn´ı SQL pˇr´ıkaz. Napˇr´ıklad bychom na serveru mˇeli n´asleduj´ıc´ı SQL dotaz.

sql = "SELECT * FROM Users WHERE UserId = " + txtUserId;

7 ZABEZPE ˇCEN´I

Tento pˇr´ıkaz by mˇel vr´atit maxim´alnˇe jednoho uˇzivatele. Pˇredpokl´ad´ame, ˇze UserId je unik´atn´ı identifik´ator uˇzivatele. Parametr txtUserId pˇrevezmeme od uˇzivatele pomoc´ı for-mul´aˇrov´eho pole. Uˇzivatel zad´a napˇr´ıklad 125 or 1=1. Nyn´ı se pod´ıv´ame na pˇr´ıkaz, kter´y se vykon´a.

SELECT * FROM Users WHERE UserId = 125 or 1=1;

Takov´y dotaz uˇz z´ısk´a vˇsechny uˇzivatele z datab´aze. Proti SQL Injection se d´a br´anit pa-rametrizovan´ymi dotazy. Dotaz se tedy nespojuje pomoc´ı ˇretˇezc˚u, ale vloˇz´ı se do nˇej para-metry, kter´e budou parsov´any jako hodnoty. Parametrizovan´e dotazy vyuˇz´ıv´am i v aplikaci SQL Tester. N´ıˇze je uk´azka k´odu, kde je dotazu pˇred´an parametr role.

@Query("SELECT u FROM User u WHERE u.role.name = :role") public List<User> findByRoleName(@Param("role") String role);

7.6.2 Odcizen´ı hesel a spr´ava sessions

Utoˇ´ cn´ık se pokouˇs´ı napˇr´ıklad deˇsifrovat z´ıskan´e heslo nebo jej vid´ı v ˇciteln´e podobˇe. Proto je v aplikaci SQL Tester heslo pro administr´atorsk´y ´uˇcet vytvoˇreno funkc´ı bcrypt. Heslo je tedy zaˇsifrovan´e a je k nˇemu pˇrid´ana tzv. s˚ul. To je ˇretˇezec, kter´y se pˇripoj´ı k heslu pˇred samotn´ym ˇsifrov´an´ım. Je tedy velice obt´ıˇzn´e p˚uvodn´ı heslo deˇsifrovat. Ostatn´ı uˇzivatel´e se autentizuj´ı pomoc´ı Shibbolethu, takˇze zde moje aplikace nehraje roli. Komunikace s Shi-bbolethem prob´ıh´a pˇres HTTPS. Podvrˇzen´ı autorizace ˇci autentizace uˇzivatele lze prov´est z´ısk´an´ım session ID. Nˇekter´e aplikace jej zas´ılaj´ı v URL. Na serveru jsem tuto moˇznost za-mezil a lze session ID pˇred´avat pouze pomoc´ı cookies. Nav´ıc pˇri nov´em pˇrihl´aˇsen´ı uˇzivatele se vˇsechny sessions vytvoˇr´ı znovu a star´e se zneplatn´ı. Toho jsem dos´ahl prostˇrednictv´ım konfigurace Spring Security. Posledn´ı ochrana proti t´eto zranitelnosti je platnost sessions po dobu 30 minut. Cookies je tak´e moˇzn´e zas´ılat pouze prostˇrednictv´ım HTTPS. Nelze je tedy odcizit napˇr´ıklad javascriptem.

7.6.3 XSS

XSS (Cross-site scripting) je ´utok, pˇri nˇemˇz na str´ance zobraz´ıme neˇz´adouc´ı data, kter´a n´am dˇr´ıve zadal uˇzivatel. Mezi neˇz´adouc´ı data ˇrad´ıme napˇr´ıklad HTML nebo v horˇs´ım pˇr´ıpadˇe javascript, kter´y napˇr´ıklad zcela zmˇen´ı vzhled a funkcionalitu str´anky. V aplikaci

7 ZABEZPE ˇCEN´I

zajiˇst’uje ochranu proti XSS escapov´an´ı speci´aln´ıch znak˚u pˇri v´ypisu.

<h:outputText value="#{taskBean.question}" />

Jedinou v´yjimku tvoˇr´ı rozhran´ı, kde uˇcitel zad´av´a specifikaci datab´aze. Tady m´a pˇrichystan´y HTML editor, v nˇemˇz nen´ı moˇzn´e mˇenit zdrojov´y k´od pˇr´ımo. Pˇr´ıpadn´e speci´aln´ı znaky tedy rovnˇeˇz budou escapov´any. Uk´azka pro v´ypis z HTML editoru.

<h:outputText value="#{solutionBean.database.specification}" escape="false" />

7.6.4 Nezabezpeˇcen´e pˇr´ım´e odkazy na objekty

Uˇzivatel se m˚uˇze napˇr´ıklad pomoc´ı URI dostat k soubor˚um, ke kter´ym by nemˇel m´ıt nikdo pˇr´ıstup. M˚uˇze to b´yt napˇr´ıklad konfigurace datab´aze. J´a m´am vˇsechny neveˇrejn´e zdroje ve sloˇzce s n´azvem WEB-INF, kter´a je pro uˇzivatele nepˇr´ıstupn´a. Tak´e zde m´am facelety, kter´e se vkl´adaj´ı do ˇsablony. To je moje osobn´ı vylepˇsen´ı n´avrhu oproti tˇem, kter´e jsem mˇel na internetu moˇznost vidˇet. Nˇekter´e URL jsou rovnˇeˇz zabezpeˇceny na z´akladˇe uˇzivatelsk´ych rol´ı. Dalˇs´ı moˇznost´ı pro ´utoˇcn´ıka je pozmˇenit parametr a z´ıskat data, kter´a mu nepatˇr´ı. J´a naˇc´ıt´am do pamˇeti pouze objekty, ke kter´ym uˇzivatel pˇr´ıstup m´a a jin´e modifikovat nelze.

Pokud by se objekt nenach´azel v pamˇeti, pak neprojde validace vstupu.

7.6.5 Nebezpeˇcn´a konfigurace

Utoˇ´ cn´ık m˚uˇze vyuˇz´ıt aktu´aln´ı pˇrednastaven´e konfigurace, kter´a b´yv´a ˇcasto nebezpeˇcn´a.

Proto jsem konfiguraci pozmˇenil. Vytvoˇril jsem tak´e vlastn´ı chybov´e str´anky a aplikace je v reˇzimu ostr´eho nasazen´ı a nevypisuje tedy pˇr´ıpadn´e chyby. Na serveru ani neexistuj´ı

Proto jsem konfiguraci pozmˇenil. Vytvoˇril jsem tak´e vlastn´ı chybov´e str´anky a aplikace je v reˇzimu ostr´eho nasazen´ı a nevypisuje tedy pˇr´ıpadn´e chyby. Na serveru ani neexistuj´ı

In document SQL TESTER (Page 32-0)

Related documents