var SectionTitles=new Array( "Zßkladnφ obrana proti p°evzetφ domΘny n" );
var SectionURLs=new Array( "155" );
var BrothersNames = new Array("BezpeΦnost a autorizace na WWW I. : protokol HTTP","BezpeΦnost a autorizace na WWW II.","HTML problΘm : cizφ k≤d a formulß°e","PφÜeme bezpeΦnou webovou aplikaci - dφl 1.","K php upload bug zve°ejn∞n exploit, Apache + mod_ssl","Zßkladnφ obrana proti p°evzetφ domΘny na stran∞ klienta","");
var BrothersIDs = new Array("32","33","110","122","154","155","");
//=====INFO======
ItemName='Article155';
InIFrame='No';
TableNum=2;
ItemID=155;
ArticleType='3';
Action='articles'
ItemTitle='Zßkladnφ obrana proti p°evzetφ domΘny na stran∞ klienta';
ItemComment='Zßkladnφ obrana proti p°evzetφ domΘny na stran∞ klienta';
ArticleHead('Zßkladnφ obrana proti p°evzetφ domΘny na stran∞ klienta', 'Michal Till', 'Michal.Till_40Seznam.cz', '6.3.2002', '00:15:03', 'Nßvod');
Intro('Mo₧nost p°evzetφ domΘny pomocφ DHTML/JavaScriptu spolu se vÜemi bezpeΦnostnφmi mechanismy je jeden z nejΦast∞jÜφch neduh∙ webov²ch aplikacφ. Dnes bych rßd poskytnul Φtenß°∙m knihovnu (PHP) kterß tento problΘm komplexn∞ °eÜφ.');
ProblΘm cross-frame scriptingu byl na tomto serveru diskutovßn ji₧ mnohokrßt. Pravd∞podobn∞ nejlΘpe danΘ tΘma nov²m Φtenß°∙m osv∞tlφ rozsßhl² Φlßnek <a href=articles.php@ID=122>PφÜeme bezpeΦnou webovou aplikaci</a>.
Velmi zjednoduÜen∞ jde o problΘm vypisovßnφ cizφho k≤du strßnkou v naÜφ domΘn∞. Takov²to k≤d pak mß p°φstup ke vÜem objekt∙m (cookies, ostatnφ framy) jako p∙vodnφ strßnky. InternetovΘ prohlφ₧eΦe, jako nap°φklad Internet Explorer, pou₧φvajφ p°itom k zabezpeΦenφ koncepci "stejnΘ adresy serveru". Strßnky z jednΘ adresy majφ stejnß bezpeΦnostnφ oprßvn∞nφ, vlo₧enφm k≤du do jednΘ strßnky tedy dojde k "uko°ist∞nφ" celΘ pou₧φvanΘ domΘny.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
N∞kterΘ server-side skripty (resp. jejich interpreti) umo₧≥ujφ implicitn∞ nastavit kontrolu vstupnφch prom∞nn²ch a nahrazenφ n∞kter²ch citliv²ch znak∙. Vlastnφ °eÜenφ mß proti tomuto ale n∞kolik p°ednostφ, p°edevÜφm jde o maximßlnφ kontrolu nad pou₧it²mi mechanizmy, kdy m∙₧eme zabrßnit vstupu nejen jednotliv²ch znak∙, ale i cel²ch slov. N∞kdy je nutnΘ zabrßnit vlo₧enφ nesprßvnΘho SQL p°φkazu (p°ed citlivΘ znaky dßme zp∞tnΘ lomφtko), n∞kdy pot°ebujeme spφÜe zabrßnit v²pisu v∞tÜφtek a menÜφtek (znaky < a > zam∞nφme za &l<b></b>t; a &g<b></b>t; v tomto po°adφ), n∞kdy je nutnΘ provΘst obojφ. Lehkou modifikacφ tohoto skriptu m∙₧eme taktΘ₧ kontrolovat nap°. sprßvnost http Φi e-mailovΘ adresy, po zjiÜt∞nφ chyby m∙₧eme ihned p°esm∞rovat prohlφ₧eΦ na strßnku s chybovou hlßÜkou Φi Üpatnou hodnotu zapsat do logovacφho souboru.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Äe nenφ velmi praktickΘ v ka₧dΘm skriptu ruΦn∞ oÜet°ovat hodnotu ka₧dΘ prom∞nnΘ, je jasnΘ. Vrhn∞me se tedy do programovßnφ knihovny, kterß tento problΘm °eÜφ komplexn∞.
P°edn∞ je nutnΘ ud∞lat vlastφ nahrazovacφ funkci. Ta zde uvedenß nenφ v mnoha ohledech ideßlnφ (nap°. ne°eÜφ problΘm zßm∞ny, kde novß hodnota obsahuje tu starou), nicmΘn∞ pro tyto ·Φely je krßtkß a efektivnφ. Pomocφ tΘ budeme nahrazovat jednotlivΘ nebezpeΦnΘ znaky a °et∞zce.
Funkce <SPAN Class=CODE>SafeVal</SPAN> Provede postupnΘ nahrazenφ vÜech znak∙ v jednΘ prom∞nnΘ. V p°φpad∞ nalezenΘho rozdφlu p∙vodnφ a novΘ hodnoty se m∙₧e n∞co provΘst. Funkce musφ oÜet°it, zda prom∞nnß nenφ typu pole, nebo¥ v tomto p°φpad∞ by bylo nutnΘ p°ekonvertovat jednotlivΘ polo₧ky zvlßÜ¥.
Nßsleduje pravd∞podobn∞ nejd∙le₧it∞jÜφ funkce. Mß v parametru pole, jeho₧ polo₧ky otestuje, pop°φpad∞ nahradφ. Je nutnΘ postupovat tak, aby se ji₧ nastavenΘ defaultnφ prom∞nnΘ typu $HTTP_USER_AGENT nep°epsaly, proto se nßzvy prom∞nn²ch berou z tohoto asocativnφho pole, ale kontrolujφ se ji₧ nastavenΘ hodnoty. V opaΦnΘm p°φpad∞ by mohl kdokoliv zmi≥ovanΘ prom∞nnΘ p°epsat.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Nynφ p°ijde ji₧ jen volßnφ kontroly prom∞nn²ch p°edßvan²ch metodami POST, GET a COOKIES.
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
<PRE><SPAN Class=CODE> MakeSafe($HTTP_POST_VARS);
MakeSafe($HTTP_GET_VARS);
MakeSafe($HTTP_COOKIE_VARS);
</SPAN></PRE>
</DIV></FONT></b></i>
<FONT Size=2><DIV Align=Justify Class=Paragraph>
Na zßv∞r bych rßd podotkl, ₧e toto °eÜenφ je jen jedno z mnoha mo₧n²ch a mß svoje v²hody i nev²hody. N∞kdy je v²hodn∞jÜφ pou₧itφ mechanizm∙ intrerpreta skript∙, Φasto je ale nutnΘ si p°id∞lat vlastnφ oÜet°enφ nad rßmec toho zabudovanΘho.