<?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; Securitatea aplicaţiilor web</title>
	<atom:link href="http://www.mihaibrehar.ro/blog/category/securitatea-aplicatiilor-web/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mihaibrehar.ro/blog</link>
	<description>consultant eCommerce, programator, vanzator de sosete</description>
	<lastBuildDate>Fri, 03 Sep 2010 14:22:30 +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>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>Un sfat banal pentru securitatea aplicaţiilor web</title>
		<link>http://www.mihaibrehar.ro/blog/un-sfat-banal-pentru-securitatea-aplicatiilor-web.html</link>
		<comments>http://www.mihaibrehar.ro/blog/un-sfat-banal-pentru-securitatea-aplicatiilor-web.html#comments</comments>
		<pubDate>Sat, 15 Mar 2008 15:47:58 +0000</pubDate>
		<dc:creator>Mihai Brehar</dc:creator>
				<category><![CDATA[Securitatea aplicaţiilor web]]></category>
		<category><![CDATA[baze de date]]></category>
		<category><![CDATA[securitate]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.mihaibrehar.ro/blog/un-sfat-banal-pentru-securitatea-aplicatiilor-web.html</guid>
		<description><![CDATA[Ca „profesie de bază” sunt programator PHP şi de multe ori mă minunez cât de defectuos sunt scrise unele aplicaţii web, atât  open-source cât şi cele cu sursă închisă. Nu stau acum să analizez un software anume şi nu vreau să arăt vinovaţii cu degetul, pentru că nici eu nu sunt sfânt în domeniul [...]]]></description>
			<content:encoded><![CDATA[<p>Ca „profesie de bază” sunt programator PHP şi de multe ori mă minunez cât de defectuos sunt scrise unele aplicaţii web, atât  open-source cât şi cele cu sursă închisă. Nu stau acum să analizez un software anume şi nu vreau să arăt vinovaţii cu degetul, pentru că nici eu nu sunt sfânt în domeniul ăsta.</p>
<p>Pe lângă codul alambicat, destul de multe aplicaţii s-au dovedit a fi pline de găuri de securitate şi în continuare vreau să dau <strong>o soluţie banală</strong> pentru <strong>limitarea atacurilor de tip SQL injection</strong>. Atenţie, am spus doar <em>limitarea</em>, nu eliminarea totală a atacurilor.</p>
<p>Nu vreau să vă ţin teoria cu verificarea datelor introduse de utilizator, pentru că asta auziţi peste tot.</p>
<p style="text-align: center"><a href="http://xkcd.com/327/"><img src="http://www.mihaibrehar.ro/blog/wp-content/uploads/2008/03/exploits_of_a_mom.png" alt="SQL Injection" /></a></p>
<p>Majoritatea site-urilor au o parte publică, accesibilă tuturor, şi o parte de administrare. Ceea ce nu pot să înţeleg e <strong>de ce ambele părţi alte site-ului folosesc aceleaşi date de acces la baza de date?</strong> Atât pentru partea de administrare cât şi pentru partea publică, se foloseşte un singur user cu drepturi depline asupra tuturor tabelelor.</p>
<p><strong>Caz concret</strong>, Wordpress (l-am ales ca exemplu doar pentru că îl folosesc în momentul în care scriu acest articol). Partea pe care o vedeţi voi, cititorii, ar trebui să se conecteze la baza de date folosind un user cu drepturi restrânse. Drept de citire pentru toate tabelele şi drept de scriere doar în tabela de comentarii.</p>
<p>Din punct de vedere tehnic, lucrul acesta nu e greu de realizat şi atunci vine întrebarea: <strong>chiar nu sunt evidente beneficiile separării drepturilor pentru accesul la db</strong>?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihaibrehar.ro/blog/un-sfat-banal-pentru-securitatea-aplicatiilor-web.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
