<?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>Mihai Brehar &#187; PHP</title>
	<atom:link href="http://www.mihaibrehar.ro/blog/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mihaibrehar.ro/blog</link>
	<description>consultant eCommerce, programator, vanzator de sosete</description>
	<lastBuildDate>Mon, 31 May 2010 07:26:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP GeekMeet #7 la Cluj</title>
		<link>http://www.mihaibrehar.ro/blog/php-geekmeet-7-la-cluj.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php-geekmeet-7-la-cluj.html#comments</comments>
		<pubDate>Mon, 12 Apr 2010 21:28:00 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=819</guid>
		<description><![CDATA[Acum ~1 an avea loc prima editie PHP GeekMeet din Cluj si din tara, de fapt. Intre timp au mai fost 5 editii si iata ca vine si editia cu numarul 7, prima din acest an. Ca de obicei, intalnirea se tine in Zorky Cafe cu incepere de la ora 11.00
Pentru ca sunt oarece probleme [...]]]></description>
			<content:encoded><![CDATA[<p>Acum ~1 an <a href="http://geekmeet.ro/cluj/2009/02/26/php-geekmeet-1-cluj/">avea loc</a> prima editie PHP GeekMeet din Cluj si din tara, de fapt. Intre timp au mai fost 5 editii si iata ca vine si editia cu numarul 7, prima din acest an. Ca de obicei, intalnirea se tine in Zorky Cafe cu incepere de la ora 11.00</p>
<p>Pentru ca sunt oarece probleme cu RSS-ul de pe geekmeet.ro, nu foarte multa lume a aflat de eveniment. Asa ca rog cei 10 cititori unici ai acestui blog sa raspandeasca vestea printr-un tweet/blogpost/whatever. Mersi!</p>
<blockquote><p>
La PHP GeekMeet #7 vor vorbi:</p>
<ul>
<li>Alina Fleșer – despre Typo3</li>
<li>Bogdan Pușcaș – despre HTTP 1.1</li>
<li>Andrei Popescu – despre PHP &#038; Web security</li>
<li>Varga Levente – despre Kohana &#038; Code Igniter</li>
</ul>
<p>Condiții de participare:</p>
<ul>
<li>Taxa propriuzisă pentru participare nu este, dar trebuie făcută o consumație minimă de 10 lei / pers</li>
<li>Participarea se face exclusiv pe bază de preînscriere! Dacă ştii sigur (măcar 90%) că vii, completează formularul de mai jos:</li>
</ul>
</blockquote>
<p><iframe src="http://spreadsheets.google.com/embeddedform?formkey=dDM2bFpWdW9icXNFX1dhQW9oSnh5LWc6MA" width="760" height="591" frameborder="0" marginheight="0" marginwidth="0">Loading&#8230;</iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php-geekmeet-7-la-cluj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP GeekMeet #6, Cluj</title>
		<link>http://www.mihaibrehar.ro/blog/php-geekmeet-6-cluj.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php-geekmeet-6-cluj.html#comments</comments>
		<pubDate>Wed, 09 Dec 2009 16:47:01 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[Offline]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[geekmeet]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=615</guid>
		<description><![CDATA[Pe 12 decembrie are loc ultimul PHP GeekMeet din 2009.
Vor vorbi:

Mihai Balaceanu despre Webservices
Dordea Cosmin despre Testarea performanțelor &#38; profiling
Gabriel Ungureanu despre Drupal (chestii avansate)

Pentru înscrieri, vedeți anunțul oficial.
Meet me there!
]]></description>
			<content:encoded><![CDATA[<p>Pe 12 decembrie are loc ultimul PHP GeekMeet din 2009.</p>
<p>Vor vorbi:</p>
<ul>
<li><a href="http://twitter.com/gizm0bill">Mihai Balaceanu</a> despre <strong>Webservices</strong></li>
<li><a href="http://www.webuml.com/">Dordea Cosmin</a> despre <strong>Testarea performanțelor &amp; profiling</strong></li>
<li><a href="http://twitter.com/gabiu">Gabriel Ungureanu</a> despre <strong>Drupal</strong> (chestii avansate)</li>
</ul>
<p>Pentru înscrieri, vedeți <a href="http://geekmeet.ro/cluj/2009/11/29/php-geekmeet-6-cluj/">anunțul oficial</a>.</p>
<p>Meet me there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php-geekmeet-6-cluj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP GeekMeet #4 Cluj</title>
		<link>http://www.mihaibrehar.ro/blog/php-geekmeet-4-cluj.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php-geekmeet-4-cluj.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 07:35:02 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[geekmeet]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=547</guid>
		<description><![CDATA[Concediile s-au cam terminat, vacanța studențească e aproape gata, așa că pe 19 septembrie 2009 vă invit la a 4-a ediție PHP GeekMeet din Cluj.
Anunțul oficial și detaliile despre înscriere le găsiți aici.
Prezintă:

Gabriel Ungureanu &#8211; Drupal:Basics
Varga Levente &#8211; To template or not to template
Mihai Brehar &#8211; Mysql: stii sa faci un backup cum trebuie?

Am văzut [...]]]></description>
			<content:encoded><![CDATA[<p>Concediile s-au cam terminat, vacanța studențească e aproape gata, așa că pe 19 septembrie 2009 vă invit la a 4-a ediție PHP GeekMeet din Cluj.</p>
<p>Anunțul oficial și detaliile despre înscriere le găsiți <a href="http://geekmeet.ro/cluj/2009/08/24/php-geekmeet-4-cluj/">aici</a>.</p>
<p>Prezintă:</p>
<ul>
<li><a href="http://blog.ag-prime.com/">Gabriel Ungureanu</a> &#8211; Drupal:Basics</li>
<li><a href="http://www.ramblingbyte.net/">Varga Levente</a> &#8211; To template or not to template</li>
<li><a href="../">Mihai Brehar</a> &#8211; Mysql: stii sa faci un backup cum trebuie?</li>
</ul>
<p>Am văzut mai demult o prezentare a lui Varga Levente despre Javascript și pot să spun că a fost foarte faină. Sunt convins că și prezentarea despre templates va fi la nivel înalt. Pe Gabriel Ungureanu nu-l știu de multă vreme, dar cred că o sa facă treabă bună cu prezentarea Drupal. La final, chiar dacă nu e despre PHP, subsemnatul o să țină o prezentare scurtă despre cum să faci un backup corect la baza de date(Mysql).</p>
<p><a href="http://spreadsheets.google.com/viewform?formkey=dDBXOWdSTUdUb1ZuTFU5UmZ3aVZRNEE6MA..">Ce mai aștepți? Înscrie-te!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php-geekmeet-4-cluj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5-cli hangs on futex</title>
		<link>http://www.mihaibrehar.ro/blog/php5-cli-hangs-on-futex.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php5-cli-hangs-on-futex.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 12:14:33 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqli]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=489</guid>
		<description><![CDATA[Am avut recent probleme cu php5-cli versiunea 5.2.6-1+lenny3 (debian) și scriu aici rezolvarea, poate va ajuta pe cineva.
Problema consta în faptul că orice script php rulat din consolă se bloca înainte să se termine execuția. Era nevoie de un ctrl+c pentru a reveni la consolă. Chiar și un banal php5 -v se bloca.
Nu mă doare [...]]]></description>
			<content:encoded><![CDATA[<p>Am avut recent probleme cu <strong>php5-cli</strong> versiunea <strong>5.2.6-1+lenny3</strong> (debian) și scriu aici rezolvarea, poate va ajuta pe cineva.</p>
<p>Problema consta în faptul că orice script php rulat din consolă se bloca înainte să se termine execuția. Era nevoie de un ctrl+c pentru a reveni la consolă. Chiar și un banal php5 -v se bloca.</p>
<p>Nu mă doare mâna să dau câte un ctrl+c, însă ce faci când scriptul rulează într-un cron? M-am trezit cu câteva sute de procese astfel agățate.</p>
<p>Buuun&#8230; rulând un strace, aveam următorul output:</p>
<div class="codesnip-container" >&#8230;<br />
munmap(0xb6e68000, 89980)               = 0<br />
gettimeofday({1244202147, 79736}, NULL) = 0<br />
munmap(0xb6e7e000, 101552)              = 0<br />
gettimeofday({1244202147, 79864}, NULL) = 0<br />
futex(0xb7090ea0, FUTEX_WAIT, 2, NULL</div>
<p>&#8230;așadar, nici o informație ajutătoare.</p>
<p>În lipsă de alte idei, am început să dezactivez modulele php instalate. Surpriză, <strong>php5-mysql</strong> se bate cap în cap cu <strong>php5-mysqli</strong>. Și asta se întâmplă doar pentru cli, serverul web merge bine mersi cu ambele module active. Pe alte servere, cu alte versiuni php5 totul e ok.</p>
<p>În concluzie, folosiți ori mysqli ori mysql.</p>
<p>Bonus, un one-liner cu care am omorât procesele agățate din cron:</p>
<div class="codesnip-container" >ps uax | grep php5 | tr -s &#8220;\t&#8221; &#8221; &#8221; | cut -f 2 -d &#8221; &#8221; | while read pid; do kill -9 $pid; done</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php5-cli-hangs-on-futex.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP GeekMeet #2 Cluj</title>
		<link>http://www.mihaibrehar.ro/blog/php-geekmeet-2-cluj.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php-geekmeet-2-cluj.html#comments</comments>
		<pubDate>Sat, 11 Apr 2009 20:45:02 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[geekmeet]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=473</guid>
		<description><![CDATA[Al doilea PHP GeekMeet din Cluj va avea loc pe 25 aprilie 2009 începând cu ora 11.00, în Zorky Cafe. Eu voi ține o prezentare legată de Xdebug.
Pentru mai multe detalii și înscrieri, click aici.
]]></description>
			<content:encoded><![CDATA[<p>Al doilea PHP GeekMeet din Cluj va avea loc pe 25 aprilie 2009 începând cu ora 11.00, în Zorky Cafe. Eu voi ține o prezentare legată de Xdebug.</p>
<p>Pentru mai multe detalii și înscrieri, click <a href="http://geekmeet.ro/cluj/2009/04/01/php-geekmeet-2-cluj/">aici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php-geekmeet-2-cluj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To Smarty or not to Smarty?</title>
		<link>http://www.mihaibrehar.ro/blog/to-smarty-or-not-to-smarty.html</link>
		<comments>http://www.mihaibrehar.ro/blog/to-smarty-or-not-to-smarty.html#comments</comments>
		<pubDate>Sun, 08 Feb 2009 22:51:46 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=354</guid>
		<description><![CDATA[Am văzut zilele astea o gramadă de articole adresate împotriva Smarty (sistemul de templates pentru PHP). Exista până și un site dedicat împotriva Smarty.
Pentru mine Smarty a însemnat o adevărată revelație prin anii 2003-2004, marcând un punct de cotitură asupra felului cum scriu cod PHP. Până atunci, codul meu era un mix interminabil de HTML [...]]]></description>
			<content:encoded><![CDATA[<p>Am văzut zilele astea <a href="http://hasin.wordpress.com/2008/01/05/once-upon-a-time-there-was-smarty/">o</a> <a href="http://phpslacker.com/2009/02/05/smarty-solving-the-wrong-problem-since-2001/">gramadă</a> <a href="http://paul-m-jones.com/?p=400">de articole</a> adresate împotriva Smarty (sistemul de templates pentru PHP). Exista până și <a href="http://nosmarty.net/">un site dedicat</a> împotriva Smarty.</p>
<p>Pentru mine Smarty a însemnat o adevărată revelație prin anii 2003-2004, marcând un punct de cotitură asupra felului cum scriu cod PHP. Până atunci, codul meu era un mix interminabil de HTML și PHP. Însă când am descoperit Smarty, am început să înțeleg și să aplic cu adevărat ceea ce tot repetau profesorii prin facultate: separarea <em>Business Logic</em> de <em>Presentation Logic</em>.</p>
<p>Aș putea spune că sunt atașat emoțional de Smarty. Când am văzut primul articol în RSS reader am zis că e doar un caz izolat, un tip căruia i s-a pus pata pe Smarty. Însă când am văzut articolele următoare într-un interval scurt de timp, au început să mi se aprindă beculețele de alarmă. O fi Smarty chiar așa de rău?</p>
<p>Am citit toate (contra)argumentele de pe <a href="http://nosmarty.net/">nosmarty.net</a> și pot să spun că <strong>nu sunt bazate pe argumente solide</strong>. Nu stau să detaliez pentru că nu am nici timp și nici chef.</p>
<blockquote><p>If you guys don’t agree with me, you can spend hell lot of time learning that {$name} actually does what you could do with “echo $name”.</p></blockquote>
<p>Nu înțeleg cum autorul unei cărți despre Smarty poate să spună așa ceva. Din câte îmi amintesc, nu mi-a luat mai mult de juma de oră să învăț Smarty (cu tot cu instalare).</p>
<p>Ok, Smarty nu e perfect, însă hai să nu-l denigrăm în halul ăsta!</p>
<p>Smarty m-a slujit exemplar în multe proiecte și n-am fost nevoit să caut alternative. Totuși, publicitatea asta negativă mă face să scot capul din nisip și să mă uit la alte siteme de templates. Încă n-am încă găsit timpul necesar, dar ar fi o prezentare interesantă pentru <a href="http://www.mihaibrehar.ro/blog/php-geekmeet.html">PHP GeekMeet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/to-smarty-or-not-to-smarty.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>PHP GeekMeet</title>
		<link>http://www.mihaibrehar.ro/blog/php-geekmeet.html</link>
		<comments>http://www.mihaibrehar.ro/blog/php-geekmeet.html#comments</comments>
		<pubDate>Sat, 24 Jan 2009 23:30:04 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[geekmeet]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=284</guid>
		<description><![CDATA[Programmers are so busy working they often don&#8217;t have time to be curious about how they could do their jobs better. (Steve McConnel)
De ceva vreme încoace, rumeg o idee împreună cu Adi: să facem un GeekMeet special despre PHP. Încerc să adun o masă critică pentru a porni întâlnirile în Cluj, iar la GeetMeet #4 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Programmers are so busy working they often don&#8217;t have time to be curious about how they could do their jobs better. (Steve McConnel)</p></blockquote>
<p>De ceva vreme încoace, rumeg o idee împreună cu <a href="http://huper.dynodas.com/">Adi</a>: să facem un GeekMeet special despre PHP. Încerc să adun o masă critică pentru a porni întâlnirile în Cluj, iar la <a href="http://www.mihaibrehar.ro/blog/geekmeet-4-si-odo-la-cluj.html">GeetMeet #4 Cluj</a> am primit un feedback pozitiv de la mai multe persoane.</p>
<p>Pe scurt, ideea se regăsește în citatul de mai sus. Personal, urmăresc RSS-urile de pe vreo două site-uri (legate de PHP, evident) și sunt abonat la php|arch. Dar cantitatea de informații e mult prea mare, RSS-urile rămân necitite și foarte rar încerc să experimentez chestiile pe care le citesc.</p>
<p>Cu toții suntem ocupați cu lucrul și avem prea puțin timp la dispoziție pentru a fi la curent cu ultimele noutăți din industrie, pentru a experimenta chestii noi. Însă sunt convins că fiecare din noi (și aici mă refer la programatori în general) încercăm să ținem pasul cu tehnologia. De aceea un PHP GeekMeet cred că ar fi binevenit, am putea să facem schimb de experiență și idei într-un mod foarte productiv.</p>
<p>Pe site-ul php.net văd o grămadă de întâlniri ale diverselor PHP User Groups din toate colțurile lumii. Noi de ce nu putem face așa ceva? Hai să ne întâlnim, să ținem prezentări practice, la obiect, să beneficiem fiecare de experiența celorlalți, să le evităm greșelile și să devenim mai eficienți.</p>
<p>Așadar, lasă un comentariu dacă ești interesat.</p>
<p><strong>Actualizare</strong>: am mutat discuțiile <a href="http://geekmeet.ro/cluj/2009/02/11/php-geekmeet-la-cluj/">aici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/php-geekmeet.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Diacritice cu virgulă și sedilă, sau cum să împaci capra și varza</title>
		<link>http://www.mihaibrehar.ro/blog/diacritice-cu-virgula-si-sedila-sau-cum-sa-impaci-capra-si-varza.html</link>
		<comments>http://www.mihaibrehar.ro/blog/diacritice-cu-virgula-si-sedila-sau-cum-sa-impaci-capra-si-varza.html#comments</comments>
		<pubDate>Tue, 06 Jan 2009 07:11:00 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=145</guid>
		<description><![CDATA[Cei care lucrați în domeniul web cunoașteți foarte bine sentimentele de mânie, frustrare și ură &#8211; trăite pe rând, sau toate o dată &#8211; ce apar în momentul în care deschideți un IE6 pentru a testa un site proaspăt terminat.
Ultima problemă legată de IE6 ține de afișarea incorectă a diacriticelor cu virgulă. Problema asta îmi [...]]]></description>
			<content:encoded><![CDATA[<p>Cei care lucrați în domeniul web cunoașteți foarte bine sentimentele de mânie, frustrare și ură &#8211; trăite pe rând, sau toate o dată &#8211; ce apar în momentul în care deschideți un IE6 pentru a testa un site proaspăt terminat.</p>
<p>Ultima problemă legată de IE6 ține de afișarea incorectă a diacriticelor cu virgulă. Problema asta îmi era practic necunoscută acum vreo 6 luni de zile, deoarece layout-urile tastaturilor românești conțineau diactitice cu sedilă (pe linux, cel puțin). Diferența?</p>
<p>Layout nou: ș, Ș, ț, Ț (afișat incorect)</p>
<p>Layout vechi: ş, Ş, ţ, Ţ (afișat corect)</p>
<p>Aici pe blog puțin îmi pasă dacă mai sunt oameni navigând cu IE6 care nu văd textul corect. Însă pe alte site-uri îmi pasă, pentru că fiecare utilizator poate deveni client. Prin urmare, a trebuit să caut o soluție.</p>
<p>Fiind vorba de un site scris în PHP, soluția a ieșit imediat la iveală și se bazează pe funcționalitatea de output buffering despre care am mai scris <a href="http://www.mihaibrehar.ro/blog/pacaleala-de-1-aprilie-pentru-phpisti.html">aici</a>.</p>
<p>Și acum, codul responsabil cu afișarea diacriticilor cu sedilă în locul celor cu virgulă (doar pentru IE6):</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> inlocuireDiacritice<span class="br0">&#40;</span><span class="re0">$buffer</span><span class="br0">&#41;</span><span class="br0">&#123;</span>

&nbsp; <span class="re0">$cuVirgula</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;ș&quot;</span>, <span class="st0">&quot;Ș&quot;</span>, <span class="st0">&quot;ț&quot;</span>, <span class="st0">&quot;Ț&quot;</span><span class="br0">&#41;</span>;

&nbsp; <span class="re0">$cuSedila</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;ş&quot;</span>, <span class="st0">&quot;Ş&quot;</span>, <span class="st0">&quot;ţ&quot;</span>, <span class="st0">&quot;Ţ&quot;</span><span class="br0">&#41;</span>;

&nbsp; <span class="kw1">return</span> <a href="http://www.php.net/str_replace"><span class="kw3">str_replace</span></a><span class="br0">&#40;</span><span class="re0">$cuVirgula</span>, <span class="re0">$cuSedila</span>, <span class="re0">$buffer</span><span class="br0">&#41;</span>;

<span class="br0">&#125;</span>

<span class="kw2">function</span> browserIE6<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>

&nbsp; <span class="kw1">return</span> <a href="http://www.php.net/strpos"><span class="kw3">strpos</span></a><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_USER_AGENT&quot;</span><span class="br0">&#93;</span>, <span class="st0">&quot;MSIE 6&quot;</span><span class="br0">&#41;</span>;

<span class="br0">&#125;</span>

<span class="kw1">if</span> <span class="br0">&#40;</span>browserIE6<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>

&nbsp; <a href="http://www.php.net/ob_start"><span class="kw3">ob_start</span></a><span class="br0">&#40;</span><span class="st0">&quot;inlocuireDiacritice&quot;</span><span class="br0">&#41;</span>;

<span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span>

&nbsp; <a href="http://www.php.net/ob_start"><span class="kw3">ob_start</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;

<span class="br0">&#125;</span>
...
<a href="http://www.php.net/ob_end_flush"><span class="kw3">ob_end_flush</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/diacritice-cu-virgula-si-sedila-sau-cum-sa-impaci-capra-si-varza.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Verificarea datelor introduse de utilizator</title>
		<link>http://www.mihaibrehar.ro/blog/verificarea-datelor-introduse-de-utilizator.html</link>
		<comments>http://www.mihaibrehar.ro/blog/verificarea-datelor-introduse-de-utilizator.html#comments</comments>
		<pubDate>Mon, 28 Jul 2008 05:06:01 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Securitatea aplicaţiilor web]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[securitate]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/?p=32</guid>
		<description><![CDATA[· Ok, ai scris o aplicaţie web. Eşti 99% sigur că e impenetrabilă?
· Când începi să scrii o aplicaţie web, te gândeşti de la început la partea de securitate?
· E o joacă de copii să adaugi partea de securitate la o aplicaţie existentă?
Dacă ai răspuns nu la toate întrebările atunci merită să citeşti acest articol. [...]]]></description>
			<content:encoded><![CDATA[<p>· Ok, ai scris o aplicaţie web. Eşti 99% sigur că e impenetrabilă?<br />
· Când începi să scrii o aplicaţie web, te gândeşti de la început la partea de securitate?<br />
· E o joacă de copii să adaugi partea de securitate la o aplicaţie existentă?</p>
<p>Dacă ai răspuns nu la toate întrebările atunci merită să citeşti acest articol. Nu e nici un secret că mulţi programatori dau atenţie securităţii abia în ultima parte a proiectului, atunci când nu există prea mult timp pentru aşa ceva.</p>
<p>În continuare vreau să ofer o soluţie elegantă pentru filtrarea datelor venite de la utilizator, şi anume, <strong>separarea codului ce ţine de securitate, de restul aplicaţiei.</strong> Astfel, soluţia poate fi adoptată cu aceeaşi uşurinţă atât pentru proiectele noi, cât şi pentru cele deja existente. Articolul este scris relativ la PHP, dar cred că aceleaşi principii sunt valabile şi pentru ASP, JSP şi alte limbaje.</p>
<p>Am să încep cu nişte exemple. Nu de puţine ori am văzut cod de genul</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;select * from products where id=&quot;</span> . <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&quot;product_id&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</div>
<p>sau</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;select * from users where username=&#8217;&quot;</span> . <a href="http://www.php.net/addslashes"><span class="kw3">addslashes</span></a><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&quot;user&quot;</span><span class="br0">&#93;</span> . <span class="st0">&quot;&#8217; and pass&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</div>
<p>sau</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <a href="http://www.php.net/strip_tags"><span class="kw3">strip_tags</span></a><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&quot;comment&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</div>
<p>Acest mod de a asigura securitatea este foarte greoi şi îţi oferă numeroase „şanse” să greşeşti. Pentru mulţi programatori e un chin.</p>
<p>Ce bine ar fi să poţi scrie liniştit
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;select * from users where username=&#8217;$_POST[user]&#8216; and pass&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</div>
<p> Ei bine, se poate, fară a face rabat pe partea de securitate!</p>
<p>Ideea de bază constă în verificarea tuturor variabilelor din GET, POST şi COOKIE înainte de a ajunge (de a fi folosite) în aplicaţia propriu-zisă. Cel mai simplu* mod pentru a face asta, este de a scrie o funcţie pentru fiecare variabilă ce trebuie verificată.</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">//pentru exemplul de mai sus in care avem $_POST[&quot;user&quot;], functia de verificare</span>
<span class="co1">//ar putea arata in felul urmator:</span>

<span class="kw2">function</span> check_POST_user<span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&quot;^[a-z0-9]$&quot;</span>, <span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">'user: valoare nepermisa'</span><span class="br0">&#41;</span>;
&nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>

<span class="co1">//aici vin scrise functii pentru restul variabilelor</span>

<span class="co1">//apelarea functiilor pentru fiecare variabila se face astfel:</span>
<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$_POST</span> <span class="kw1">as</span> <span class="re0">$var</span> =&amp;gt; <span class="re0">$value</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; <span class="re0">$function_name</span> = <span class="st0">&quot;check_POST_&quot;</span> . <span class="re0">$var</span>;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/function_exists"><span class="kw3">function_exists</span></a><span class="br0">&#40;</span><span class="re0">$function_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;scrie functie pentru a verifica _POST[$var]&quot;</span><span class="br0">&#41;</span>;
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="re0">$function_name</span><span class="br0">&#40;</span><span class="re0">$value</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Pentru simplitate, am dat un exemplu minimal de programare procedurală, dar ideea se poate extinde foarte frumos folosind clase şi obiecte.</p>
<p>Folosesc această metodă de vreo 4 ani şi pot să spun că mi-a adus multe beneficii şi m-a eliberat de o grămadă de <strong>stres</strong>. În încheiere, vreau să subliniez câteva avantaje ale acestei metode:</p>
<ul>
<li>codului aplicaţiei devine mai simplu</li>
<li>ai o privire de ansamblu: tot ce ţine de securitate se găseşte într-un loc bine stabilit</li>
<li>poţi să ştii în orice clipă care variabile sunt verificate şi care nu</li>
<li>se pretează bine la lucrul în echipă; poţi să pui un specialist să scrie funcţiile de verificare</li>
</ul>
<p><strong>Programare plăcută!</strong></p>
<p>* Voi prezenta o modalitate şi mai simplă într-un articol viitor <img src='http://www.mihaibrehar.ro/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/verificarea-datelor-introduse-de-utilizator.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Păcăleală de 1 aprilie, pentru PHPişti</title>
		<link>http://www.mihaibrehar.ro/blog/pacaleala-de-1-aprilie-pentru-phpisti.html</link>
		<comments>http://www.mihaibrehar.ro/blog/pacaleala-de-1-aprilie-pentru-phpisti.html#comments</comments>
		<pubDate>Mon, 31 Mar 2008 22:55:03 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[1 aprilie]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/pacaleala-de-1-aprilie-pentru-phpisti.html</guid>
		<description><![CDATA[Deschizându-mi RSS reader-ul ajung pe slashdot.org unde găsesc link-uri spre mai multe pagini cu idei de păcăleli. Distrându-mă de ce vedeam pe acolo, am ajuns la pagina asta şi pe loc mi-a încolţit o idee asemănătoare. Aşa că m-am pus pe treaba, farsa având ca ţintă un client pe care-l cunosc bine şi ştiu că [...]]]></description>
			<content:encoded><![CDATA[<p>Deschizându-mi RSS reader-ul ajung pe slashdot.org unde găsesc link-uri spre mai multe pagini cu idei de păcăleli. Distrându-mă de ce vedeam pe acolo, am ajuns la <a href="http://www.ex-parrot.com/~pete/upside-down-ternet.html">pagina asta</a> şi pe loc mi-a încolţit o idee asemănătoare. Aşa că m-am pus pe treaba, farsa având ca ţintă un client pe care-l cunosc bine şi ştiu că nu se supără (sau cel puţin aşa sper).</p>
<p>Pe scurt, vreau să inversez toate link-urile de pe un „site”, având acces la codul sursă, bineînteles. Adică <a href="http://www.google.ro/">un link</a> se transformă în <a href="http://www.google.ro/">knil nu</a>. Restul textului de pe site rămâne neschimbat iar URL-urile funcţionează în continuare. Am pus site între ghilimele deoarece nu e vorba de un site cu mii de useri online ci e vorba de un backend la care au acces 5-6 persoane.</p>
<p>Soluţia tehnică se bazează pe funcţionalitatea de  <a href="http://www.php.net/manual/en/function.ob-start.php">output buffering</a> pe care o oferă PHP-ul. Funcţia de mai jos este un callback pentru ob_start();</p>
<pre>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw2">function</span> link_reverse<span class="br0">&#40;</span><span class="re0">$buffer</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/preg_match_all"><span class="kw3">preg_match_all</span></a><span class="br0">&#40;</span><span class="st0">&quot;|&amp;lt;a.*&amp;gt;(.*)&amp;lt;/a&amp;gt;|U&quot;</span>, <span class="re0">$buffer</span>, <span class="re0">$regs</span>, PREG_PATTERN_ORDER<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span> = <span class="nu0">0</span>; <span class="re0">$i</span> &amp;lt; <a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$regs</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="re0">$i</span>++<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="re0">$text</span> = <span class="re0">$regs</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&quot;^[a-z0-9<span class="es0">\.</span><span class="es0">\ </span><span class="es0">\-</span>]*$&quot;</span>, <span class="re0">$text</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//nu avem doar un simplu text in interiorul ancorei, ignoram</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span>;
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; <span class="re0">$reverse</span> = <span class="st0">&quot;&quot;</span>;
&nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$j</span> = <a href="http://www.php.net/strlen"><span class="kw3">strlen</span></a><span class="br0">&#40;</span><span class="re0">$text</span><span class="br0">&#41;</span> - <span class="nu0">1</span>; <span class="re0">$j</span> &amp;gt;= <span class="nu0">0</span>; <span class="re0">$j</span>--<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$reverse</span> .= <span class="re0">$text</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> = <a href="http://www.php.net/str_replace"><span class="kw3">str_replace</span></a><span class="br0">&#40;</span><span class="st0">&quot;&amp;gt;&quot;</span> . <span class="re0">$text</span> . <span class="st0">&quot;&amp;lt;&quot;</span>, <span class="st0">&quot;&amp;gt;&quot;</span> . <span class="re0">$reverse</span> . <span class="st0">&quot;&amp;lt;&quot;</span>, <span class="re0">$buffer</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">return</span> <span class="re0">$buffer</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Aveţi grijă mâine. Noapte bună!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/pacaleala-de-1-aprilie-pentru-phpisti.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
