Prikaz objav z oznako PHP. Pokaži vse objave
Prikaz objav z oznako PHP. Pokaži vse objave

Torek, februar 05, 2008

Magic Quotes v PHP

Magic quotes je proces v PHP, ki avtomatično ubeži enojnim in dvojnim narekovajem ter poševnici nazaj in NULL znaku. To pomeni, da bo ta proces avtomatično spremenil nek niz tako, da bo vsem zgoraj omenjenim znakom dodal spredaj poševnico nazaj (\). Znak, ki ima pred seboj poševnico nazaj, imenujemo ubežni znak in ima drugačen pomen kot znak, ki poševnice nazaj pred seboj nima.

Zakaj potrebujemo magic quotes?
Predpostavimo, da smo izdelali spletno stran z novicami, kjer imamo tudi obrazec preko katerega lahko obiskovalci strani dodajo svoj komentar. Kaj se zgodi, če v obrazec obiskovalec zapiše
Uporabi iskalnik Mat'Kurja?

Problem se pojavi, ko želimo zgornji komentar vpisati v bazo. Vpis v bazo opravimo z SQL stavkom, npr:
$sql = "INSERT INTO komentar SET vsebina = '$oddan_komentar'";

Kot vidimo, se niz znakov v SQL ukazu obda z enojnim narekovajem. Prvi označuje začetek niza, drugi pa konec. Kaj pa v našem primeru, ko že sam komentar vsebuje enojni narekovaj? Ja, to pokvari SQL stavek, saj baza podatkov prehitro zaključi SQL ukaz, ki ga vidi kot:
$sql = "INSERT INTO komentar SET vsebina = 'Uporabi iskalnik Mat'Kurja'"
Le odebeljen del SQL stavka zgoraj je sintaktično pravilen, preostali del, torej besedica Kurja'" pa sedaj povzroči napako.

Kako odpraviti težavo?
Problem odpravimo, da ubežimo enojnemu narekovaju za besedo Mat. To naredimo tako, da pred enojni narekovaj zapišemo poševnico nazaj z uporabo funkcije addslashes(). SQL ukaz bo tako sintaktično pravilen, saj bo enojni narekovaj, ki ima pred seboj poševnico nazaj, obravnavan kot znak enojni narekovaj in ne kot posebni znak, ki zaključuje SQL ukaz.

Alternativa "ročnemu" načinu je avtomatočni način, to je magic quotes. Ta avtomatično doda nizu ustrezne ubežne znake in tako zavaruje SQL ukaze pred napakami oz. možnimi zlorabami. Nepridipravi bi lahko z uporabo narekovajev zaključili vsebino in dodali zraven še nekaj zlonamerne kode. Ta pomanjkljivost je bolje poznana kot "SQL injection".

Magic Quotes je bil v PHP uveden kot varovalka pred slabo napisano kodo, ki bi omogočala zlorabe.

Obstajajo tri vrste magic quote procesov:
- magic_quotes_gpc, ki doda poševnice nazaj spremenljivkam, ki so PHP skripti poslane preko POST, GET ali COOKIE
- magic_quotes_runtime, doda poševnice nazaj podatkom zunanjega vira kot je datoteka ali baza podatkov
- magic_quotes_sybase, ubeži enojnemu narekovaju tako, da pred njega postavi še en enojni narekovaj (namesto poševnice nazaj)

Kako preverimo, če je magic quotes vključen?

if (get_magic_quotes_gpc()) {
echo "Magic Quotes je vključen.";
}



V primeru, da je magic quotes vključen, moramo vsebino spremenljivke obdelati s pomočjo funkcije stripslashes(), ki odstrani poševnice. Šele nato je primerna za prikaz na zaslonu. Za vpis v bazo pa to ni potrebno, saj baza te znake sama odstrani in pravilno shrani vsebino.

Če naš strežnik podpira PHP starejši od verzije 6, moramo v skripti poskrbeti za preverjanje ali je magic quotes vključen ali ne. Če je vključen, se moramo zavedati, da vsebina lahko vsebuje tudi več poševnic nazaj, ki jih moramo pred izpisom odstraniti. V koliko pa magic quotes ni vključen, pa mora programer sam poskrbeti za varnost skripte, pred izvrševanjem SQL ukazov.

Nedelja, november 04, 2007

Nizi in ubežni znaki v PHP

Nek niz znakov v PHP lahko izpišemo s funkcijo print ali echo:
print "Pozdravljeni obiskovalci";
Zgornji stavek izpiše "Pozdravljeni obiskovalci". Znaki, ki so obdani z dvojnimi narekovaji torej predstavljajo niz. PHP teh znakov ne obdeluje, torej če bi zapisali "50+100", PHP tega ne bi videl kot aritmetično operacijo, temveč kot niz znakov in jih v taki obliki tudi izpisal:
print "50+100";

Druga možnost je uporaba enojnih narekovajev. Oba zgoraj navedena primera, bi enako delovala, če bi uporabili enojne narekovaje. Razlika se pokaže, ko želimo v niz dodati še nek drug niz, ki je shranjen v svoji spremenljivki. Poglejmo primer:

$stevilo_obiskovalcev = "5000 obiskovalcev";

printf "Spletno stran je obiskalo $stevilo_obiskovalcev.";
printf 'Spletno stran je obiskalo $stevilo_obiskovalcev.';

Zgornji primer bi izpisal:
Spletno stran je obiskalo 5000 obiskovalcev.
Spletno stran je obiskalo $stevilo_obiskovalcev.

Pri zapisu z dvojnimi narekovaji vidimo, da se uporabi vrednost spremenljivke, medtem ko se pri uporabi enojnih narekovajev izpiše besedilo kot je vidno v kodi.


Kako pa postopamo, ko želimo v našem nizu uporabiti enojne ali dvojne narekovaje? Enostavno, pomagamo si s tako imenovanimi ubežnimi znaki (ang.: escape characters), ki seveda zmorejo še veliko več. Poglejmo nekaj primerov:

print "Če želimo izpisati \"dvojne narekovaje\" uporabimo pred narekovajem poševnico nazaj (\)";
print 'Bolj pregledno je, če uporabimo "enojne narekovaje", med njimi pa lahko poljubno uporabimo dvojne narekovaje';

Ubežni znaki pomagajo urediti izgled zapisane kode in ne izgled same strani, kot jo vidi obiskovalec. Poskusite zapisati nekaj stavkov PHP kode in nato poglejte kodo vaše strani. Videli boste, da je koda dokaj nepregledna in se večinoma nadaljuje v dolgih, neprekinjenih vrsticah.

Takšno kodo lahko uredimo z uporabo naslednjih ubežnih znakov:
\n pomeni new line
\t pomeni tab
\r pomeni carriage return

Še primer:

print "To je prva vrtica na zaslonu in v kodi;
print "To je druga vrstica na zaslonu vendar še vedno prva v kodi;
print "\nTo bo tretja vrstica na zaslonu in druga v kodi";
print "\n\tVrstica, ki je v kodi zamaknjena";

Vidimo, da izgled na strani določamo z običajnim XHTML, medtem ko za ustrezen izgled kode poskrbimo z ubežnimi znaki.






Ponedeljek, oktober 15, 2007

Tabele v PHP

Če v PHP-ju potrebujemo spremenljivko, ki lahko vsebuje več elementov, lahko za to uporabimo kar tabelo (ang. array). Element je lahko število, niz ali pa zopet tabela.

PHP pozna dve vrsti tabel: indeksne in asociativne. V indeksni tabeli je vsak element določen s številko (indeksom), v asociativni pa z nizom znakov (asociacijo).

Primer izdelave indeksne tabele:
$tabelaStevil = array(24, 55, 40, 10);

Ni nujno da so vsi elementi tabele istega tipa:
$mesanaTabela = array(24, "Martin", 110, "Krpan");

Do vseh elementov tabele najlažje dostopimo z uporabo zanke foreach:

foreach ($tabelaStevil as $stevilo) {
echo "$stevilo";
}


Izpis:
24
55
40
10

Do posameznega elementa indeksne tabele dostopimo tako, da v oglatem oklepaju navedemo indeks (lokacijo) elementa, ki ga želimo izpisati ali uporabiti.

echo "$tabelaStevil[2]";

Izpis: 40
(pozor, prvi element tabele ima indeks 0 in ne 1, zato gre v našem primeru za tretji element tabele, ki pa se nahaja na indeksu 2)

Dodajanje je enostavno, dva primera
$tabelaStevil[2] = 5 ; element, ki se nahaja na indeksu 2 v tabeli, prepišemo z vrednostjo 5
$tabelaStevil[] = 100; dodali smo element na konec tabele


Pa poglejmo še kreiranje asociativne tabele:
$oseba = array('ime'=>'Martin', 'priimek'=>'Krpan');

Do imena osebe lahko sedaj enostavno pridemo z uporabo asociacije 'ime':
echo "$oseba['ime']";
Izpis: Martin