Am observat de-a lungul timpului că o bună parte a începătorilor în ale programării PHP au o mare problemă în a înţelege şi a folosi corect facilităţile oferite de… ghilimele şi apostroafe.

Diferenţa esenţială între cele două modalităţi de a afişa stringu-uri este la interpretarea conţinutului. Vom considera următoarele exemple:

Exemplul 1

echo 'foo';
echo "bar";

Exemplul 2

$str = 'foo bar' . "\r\n";
echo "Un string frumos afisat este: $str";

Exemplul 3

echo 'link html';
echo "link html";

Exemplul 4

$mysql = "select id, name, age from people where name like 'george%'";
$mysql = 'select id, name, age from people where name like \'george%\'';

Aşadar, diferenţa esenţială este la modul de interpretare a conţinutului aflat între cele două simboluri grafice şi anume în cazul ghilimelelor se interpretează, iar în cazul apostroafelor nu se interpretează. Astfel, orice string delimitat de apostroafe care va conţine numele unei variabile va printa numele variabilei incluzând semnul dolar din faţa acestia, pe cand un acelaşi string delimitat de ghilimele va printa valoarea acelei variabile şi nu numele ei. De aici se poate deduce uşor ca în cazul printării unui string simplu se preferă utilizarea apostroafelor metodă care va fi mai rapidă decât cea cu ghilimele, în care interpretorul va încerca să gasească şi să înlocuiască posibilele variabile inserate de către programator (deci, timp mai mare de execuţie)
Este de observat şi faptul că în anumite cazuri este de păreferat folosirea ghilimelelor în detrimentul apostroafelor, sau invers, lucru care ar duce la o lizibilitate şi o coerenţă mai marită a codului sursă, plus că poate elimina câteva erori de parsare în cazul unor stringuri mai complexe. În exemplul 3 se poate observa cum folosirea de apostroafe pentru a printa un cod HTML este mai convenabil decat folosirea ghilimelelor, fapt ce ar determina ca oricăror atribute din tag-urile HTML să li se aplice metoda escape. Deasemeni, caz contrar, exemplu 4 arată cum un string ce ar reprezenta o interogare SQL ar fi mai uşor de citit şi înţeles dacă s-ar folosi ghilimelele.

Ghilimele magice

Ghilimelele magice, sau magic quotes, reprezină o funcţionlitate a limbajului PHP care presupune introducerea unui backslash (\) înaintea oricarui caracter apostrof, ghilimea, backslash şi NULL, procedeu cunoscut sub numele escape. Motivaţia pentru care s-a introdus această funcţionalitate a fost aceea de a ajuta programatorii incepători, sau neexperimentaţi de a preveni aşa zisele sql injections.
Controlul acestei facilităţi se face cu ajutorul unor directive din cadrul php.ini

  1. magic_quotes_gpc are efect asupra variabilelor provenite prin GET, POST, COOKIE, este setata implicit pe on şi nu poate fi modificată la în timpul excuţiei.
  2. magic_quotes_runtime în caz că este activată va avea efect asupra tuturor funcţiilor care returnează date din surse externe, provenite de la utilizator sau chiar şi din baze de date sau fişiereş implicit are valoarea off şi poate fi modificată ân timpul execuţiei.
  3. magic_quotes_sybase daca este activată va dubla orice apostrof cu un alt apostrof, în loc de backslashş totodată va suprascrie directiva magic_quotes_gpc; atenţie aşadar, având ambele directive activate, acestea vor determina ca doar apostroafele sa fie dublate de un alt rand de apostroafe, restul caracterelor (ghilimele, backslash, NULL) vor rămâne nemodificate.

Ghilimelele magice sunt activate implicit cu o instalare nouă de PHP şi cum efectul lor nu este vizibil întotdeauna, unii programatori nici nu sunt conştienţi de existenţa lor si de posibilele probleme care le pot cauza. De-a lungul timpului au existat mai multe critici aduse acestei facilităţi, lucru care a dus la considerarea ei ca fiind invechită, dintre care enumerăm:

  1. nu toate datele furnizate de catre utilizatorului unei aplicaţii web sunt menite a fi introduse într-o bază de date; ele pot fi stocate într-o sesiune sau afişate pe ecran, iar introducerea unui bachslash ar altera considerabil conţinutul acestor date
  2. nu toate datele introduse de către un utilizator sunt obţinute din surse aflate sub protecţia ghilimelelor magice; de exemplu o valoare poate fi obţinută de la utilizator, stocată în baza de date(deci sub influenţa ghilimelelor magice), apoi citită şi folosită intr-o alta operaţie sql unde ghilimelele magice nu au efect, aspect care ignorat de un programator ar putea avea consecinţe grave
  3. efectul de ghilimele magice se bazează pe folosirea funcţiei addslashes() care nu funcţionează corect pe string-urile Unicode, deci posibilitatea de a obţine un sql injection este ridicată (se recomandă în cazul inserărilor in baza de date folosirea funcţiilor de escape specifice, gen mysql_real_escape_string())
  4. adaugarea de ghilimele magice şi scoaterea lor atunci cand se cere poate fi, în funcţie de aplicaţie, o operaţie costisitoare ca timp, deci preferabil de evitat

În versiunea 5 a PHP ghilimelele magice au fost considerate depăşite si au fost marcate pentru eliminare odata cu versiunea 6 a limbajului de programare.

Trackback

no comment until now

Add your comment now