MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

Hata Yapilari'nin Ele Alinmasi - BOLUM 5 Yazar: Serkan Tarih: 01/03/02

E-Mail,URL ve Onemli Dosya yollarinin Kontrolu ve Guvenligi...

Karekter Siniflari - [xyz]

Bu koseli parentezlerin icine yazilan karekterlerin "kabul edilebilir" olacagini belirtir.Ornek vermek istersek $bulunacak_kelime = "m[ui]zika" yazilirsa "muzika" ve "mizika" kelimelerinin ikiside bulunacaktir.

Tersini yapmak istersek ^ karekterini kullanmaliyiz.Boylece bu isaret'ten sonra yazacagimiz her karekter bulunmayacaktir.

$bulunacak_kelime = "^1234567890" yazarsak bu su demektir:
"Sayi haricindeki herseyi bul"

Eger belirli bir ASCII setini komple tanimlamak istiyorsak o zaman "-" tire isareti kullanilmalidir.Yukarida yazilan ,ve butun sayilarin bulunmamamasini istedigimiz ornek icin alternatif olarak su yazilabilir,

$bulunacak_kelime = [^0-9]
"Sayi haricindeki herseyi bul"

Ayni sekilde butun kucuk harfleri birden tanimlamak icin su kullanilabilir,

[a-z]

Bu ifadeleri ic-ice gececek sekilde de kullanabiliriz.Bir ornek vermek istersek,

Single bir hexadecimal dijit icin su ifade yazilabilir : [0-9A-F]

Eger soyle yazmis olsaydik ,

[0-9][A-F] bu su anlama gelecekti : Bir sayi ve ardindan gelen karekter A ile F arasinda.

Tum bu islemeler icin isimizi kolaylastirmak adina kisayollar yaratimistir.Bu kisayollari bir tablo halinde aciklamak istersek,

Kisayol Acilimi Aciklamasi

\d [0-9] Dijit 0 dan 9 kadar

\w [0-9A-Za-z_] "Harf" veya "Sayi" karekter

\s [ \t\n\r] Bir "bosluk"karekteri,tab yeni bir satir veya return

Bunlarin negatiflaeri de su sekilde yazilir,

Kisayol Acilimi Aciklamasi

\D [^0-9] Dijit olmayan

\W [^0-9A-Za-z_] "Harf" veya "Sayi" karekter olmayan

\S [^ \t\n\r] Bosluk kareketeri olmayan

Cipalar(Anchors)

Simdiye kadar string ifade icinde bulunacak karekterleri nasil tanimlayacagimizi gorduk.Yukarida kullanilan teknikler ile,verecegimiz bir ifade string icinde herhangi bir yerde aranacaktir.Eger bulunursa istedigimiz islem uygulanacaktir.

Biz istedigimiz ifadenin dtringin hangi bolgesinde aranacagini belirleyebilirz.Ornegin yapmak istedigimiz arama string ifadenin en basinda veya en sonunda yer alabilir.Bu isleme programcilik literaturunde "anchoring" adi verilmektedir.

Aslinda turkceside pek mantiksiz degildir.Bir gemi gibi birr yere capanizi atip sadece o bolge uzerine yogunlasmak bence u yontem icin yapilmis iyi bir tanimlama...

Iki tane "anchor" karekteri bulunmaktadir.Bunlardan ilki ^ isaretidir.Stringin basini tanimlamak icin kullanilir.Ikinci anchor ise $ isaretidir.Bu isaret stringin sonu icin kullanilir.

Ornek vermek istersek arayacagimiz stringin en basinda buyuk bir "I" harfi ariyorsak,

"^I" ,ifadesi yazilabilir.

"Alternatif" Kullanimi

Ornek vermek gerekirse sunu yapamak istiyoruz : Elimizde iki kelime var ve ikisinden biriniz buldugu zaman arama islemimiz basarili olsun istiyoruz,o zaman yapmamiz gereken islem sudur,

Aranan birinci kelimemiz "evet" ve ikinci kelimemiz "belki" ise yazacagimiz regular expresions : "evet|belki" olacaktir.

Qualifiers

Aradigimiz bir set karekter eger bir defa veya birden fazla olarak veya hic tekrarlanmiyorsa ne yapabiliriz?. Iste sorumuzun cevabi bu konuda aciklaniyor...

Bu konuda en kolay kullanilan isaretimiz "?" soru isaretidir.Buna en guzel ornegi ingilizcedeki "he" ve "she" kelimelerinin gectigi yeri bulmak istiyorsak verilebilir.Bunun icin yazmamiz gereken "s?he" olacaktir.

Baska bir ornek vermek istersek,"woman" ve "man" icin "(wo)?man" olacaktir. Biraz daha detayli aciklamak icin asagidaki tabloyu inceleyebilirsiniz :

bea?t "beat"' veya "bet"
bea+t "beat",beaat","beaaat"... boyle devam eder
bea*t "bet","beat","beaat" ...boyle devam eder

Acemi kullanicilar icin bu sekilde kullanilan "*", "+" vb gibi isaretlerin sonucu nadiren istedikleri gibi olur...Uzmanlasincaya kadar bunlari bilmeniz ama uzak durmaniz tavsiye edilmektedir.

Miktar Belirlemek

Belirledigimiz sayi mikatari kadar karekterin eslesmesini istiyor olabiliriz.Buna ornek olarak bir satirdaki 3 digit karekter verilebilir.

Bir baska ornek iki veya uc tane boslugu saymak istiyorsak : \s{2,3} yazmak yeterlidir.Bu durumda "2 veya 3 bosluk gecen yerler bulunacaktir"

simdi de "en az" ve "en cok" ifadelerini nasil tanimlayabiliriz ona bakalim,

{2, } bunun anlami "2 veya daha fazladir"
{, 3} bunun anlami "3 veya daha azdir"

en son olaraak biraz kompleks bir ifade yazmaya calisalim,ve tam olarak kac tane kareketerin bulunmasini istedigimiz yazalim,

"\b\w{5}\b" ifadesinin tam turkcesi sudur : bes-harf krekteri bul.

Bu anlatiklarimizin isiginda tum konuyu bir tabloda ozetlemek istersek,

MetaKarekter Anlami
[abc] "a,b,c" karekterlerinden herhangi birisi
[^abc] "a,b,c" karekterlerinden birisi olmayan herhangi bir karekter.
[a-z] a'dan z'ye tum kucuk harfler.
\d \D Digit karekter , Digit olmayan karekter.
\w \W Harf karekter , Harf olmayan karekter.
\s \S Bosluk karekteri , Bosluk olmayan karekter.
\b \w ve \W tanimlamalari icin sinir isaretlemesi.(Onek yukarida yaptik)
. Yeni bir satirdan baska her turlu karekter.
(abc) "abc" karekter grubunun tamami.
? 'den ondeki karekter veya grup 0 veya 1 defa sayida orada olabilir.
+ 'dan ondeki karekter veya grup 1 veya daha sayidafazla orada olabilir
* 'dan ondeki karekter veya grup 0 veya daha fazla sayida orada olabilir.

{x,y} 'den ondeki karekter veya grup x den y'ye kadar olan sayida orada yer alabilir.

{,y} 'den ondeki karekter veya grup en fazla y kadar orada olabilir.
{x,} 'den ondeki karekter veya grup en az x kadar orada olabilir.
{x} 'den ondeki karekter veya grup tam olarak x kadar orada olabilir.

^ String ifadenin baslangici.
$ String ifadenin sonu.

E-Mail Adresleri'nin Kontrol Edilmesi

Turkiye'de halen bir cok insan e-mail adresinin nasil bir formatta olmasi gerektigini bilmemektedir.Kullanicilar,ISS (Internet Servis Saglayici)'lerin kendilerine sagladiklari kolaylik ile bazen aldiklari "hesap adini" kendi e-mail adresleri olarak kullanmaya calismaktadir.(Ayni ag uzerinde yer alan kullanicilar birbirlerine e-mail gondermek istediklerinde bagli bulunduklari domain adini yazmalari gerekmez.)Eger kullanicinin aldigi hesap adi "serkan" ise ona tahsis edilen email adresi sudur :

serkan@servissaglayici.com veya serkan@servissaglayici.net

gibi olacaktir.Ben hesabi "turk.net" sirketinden almis isem benim mail adresim soyle olacaktir,

serkan@turk.net .peki ben baska bir turk.net kullanicina mail gonderirken bu sekilde mi yazmam gerekiyor.Hayir, eger gondereceginiz kisinin turk.net'te bir kullanici hesabi varsa ona direkt olarak adini kullanarak mail gonderebilirsiniz.

Arkadasimin kullanici adi "ebasyigit" olsun.Dolayisi ile mail hesabi da ebasyigit@turk.net olacaktir.

Ben ona mail gonderirken direkt olarak "ebasyigit" yazabilirim...

Fakat unutmayin eger email gondereceginiz kisinin kullanici hesabi sizin ISS ile ayni degilse mutlaka bir @ isareti kullanip bagli bulundugu domain sistemini belirtmelisiniz.Mesela America Online'da kullanici hesabi olan arkadasimin kullanici adi "fena" dir.(Aslinda geriside varda karistirmayin olayi amerikalilar bayiliyorlar ismine herifin:))

dolayisi ile email adresinin formati su sekilde olacaktir : fena@aol.com

tum bu bilgilerin isiginda formdan alacagimiz bir email adresinin sekilsel olaraak butunlugunu nasil kontrol edebiliriz :

Bunu yapmak icin cok sert kurallara dayanmayan bir reg.exp. Yazalim :

^[^@ ]+@[^@ ] +\.[^@ \.]+$

^ String'in baslangici..
[^@ ] orada bir @ isareti veya bosluktan baska hersey olabilir...
+ bir veya tekrarlamis sekilde o karakterden yer alabilir.
@ evet simdi bir @ karekteri olmasi grektigini soyluyoruz...
[^@ ] orada bir karekter var ama @ ve bosluktan farkli...
+ bir veya tekrarlamis sekilde o karakterden yer alabilir.
\. orada bir nokta olmali(gordugunuz gibi \ sembolu ile escape edilmek zorunda)
[^@ \.] orda bir karekter var ama @ veya bosluk veya noktadan farkli olacak...
+ bir veya tekrarlamis sekilde o karakterden yer alabilir.
$ stringin sonu....

Bu konu ayni zamanda turk-php.com/forum da tartisilmisti.

http://www.turk-php.com/forum/read.php?f=7&i=23&t=18

evet cok fazla kati kurallar koymadim ama yukaridaki aciklamaya uygun bir sekil
yarattim.Bu maskeye uymayan yazilim sekilleri artik program tarafindan kabul edilmeyecektir.

Simdi bu reg.exp. Programin icine tasiyalim ve kucuk bir kontrol algoritmasi yazalim...

Email Adresinin Kurallara Uygunlugunun Kontrolu

1.Text editorunuzu acin ve asagidaki kodlari yazin.

<HTML>
<HEAD></HEAD>
<BODY>
<?php
//email_kontrol.php

function email_kontrol ($adres) {

$Sonuclar = ereg("^[^@ ]+@[^@ ]+\.[^@ \.]+$", $adres,$kayit);

if ($Sonuclar) { $uygun = "Evet"; } else { $uygun = "Hayir"; }
echo ("Girdiginiz adres \"$adres\" icin sonucumuz : $uygun <BR>\n");
}

email_kontrol ("sceylani18256");
email_kontrol ("sceylani@aol.com");
email_kontrol ("serkan ceylani@aol.com");
email_kontrol ("sceylani@mail@msn@aol.com");
email_kontrol ("sceylani@usa.net");

?>

</BODY>
</HTML>

2.Bu dosyayi email_kontrol.php olarak kayit edin.

3.Scripti calistirdiginiz zaman hangi email adreslerinin dogru yazildigini hangilerinin dogru olmadigini programin nasil karar verdigini goreceksiniz.

Not : Burada kullanilan reg.exp tamamen emailin dogru olup olmadigini kontrol etmemektedir.Daha kesin ve kati kurallari olan reg.exp. lari siz de yazabilirsiniz.

Ornek Programlar

http://www.turk-php.com/ornekler/email_kontrol.php

URL Adresinin Kurallara Uygunlugunun Kontrolu("URL" kisaltmasinin Ingilizcesi "Uniform Resource Locator" 'dir)

Gene ayni sekilde reg.exp ifademizi tanimlayarak baslayalim,

^[a-zA-Z0-9]+://[^ ]+$

^ : stringi yazmaya basliyoruz.
[a-zA-Z0-9] : orada harf ve sayilar yer alabilir.

+:// : orada bir "://" set karekteri yer alacaktir.
[^ ] : orada bir bosluk olamaz.
$ : stringi yazmayi bitiriyoruz.

Simdi bu ifadeyi programa monte edelim,

1.Text editorunuzu acin ve asagidakileri yazin.

<HTML>
<HEAD></HEAD>
<BODY>
<?php
//url_kontrol.php

function url_kontrol ($Yol) {

$Sonuclar = ereg("^[a-zA-Z0-9]+://[^ ]+$", $Yol , $kayit);
if ($Sonuclar) { $uygun = "Evet"; } else { $uygun = "Hayir"; }
print (" Girdiginiz URL \"$Yol\" icin sonucumuz : $uygun <BR>\n ");
}

#Evet simdi adreslerimizi kontrol edilmesi icin fonksiyona gonderiyoruz.

url_kontrol ("www.turk-php.com");
url_kontrol ("http://www.turk-php.com/");
url_kontrol ("http://www.turk-php. bosluk var.com");
url_kontrol ("ftp://www.turk-php.com");
url_kontrol ("http://www.turk-php.com/kodgoster.php?Yol=%2Findex.php");

?>
</BODY>
</HTML>

2.Bu dosyayi "url_kontrol.php" olarak kayit edin.

3.Dosyayi browser'dan actiginizda hangi adreslerin uygun hangilerinin uygun olmadigini goreceksiniz.

Ornek Programlar

http://www.turk-php.com/ornekler/url_kontrol.php

Kullanicilarin "Onemli Server Klasorler'ine" Erisimini Engellemek

Bu uygulamamizda PHP'yi kullanarak kullanicinin girdigi bazi verileri filtreden gecirecegiz.

1.Text editorunuzu acin ve asagidakileri yazin.

<HTML>
<HEAD></HEAD>
<BODY>
<?
//saglikli_yol.php

function Yol_Kontrol ($Girilen_Yol) {

$Cikilan_Yol = ereg_replace("\.[\.]+", "" , $Girilen_Yol);
$Cikilan_Yol = ereg_replace("^[\/]+", "" , $Cikilan_Yol);
$Cikilan_Yol = ereg_replace("^[A-Za-z][:\|][\/]?", "" , $Cikilan_Yol);
return($Cikilan_Yol);
}

function YK($ykgirdiyol) { #Donen yol degerlerini ekrana basmak icin kullanilan fonksiyon

$ykciktiyol = Yol_Kontrol ($ykgirdiyol);
print ("Cagrilan fonksiyon Yol_Kontrol () \"$ykgirdiyol\" yolunu \"$ykciktiyol\"
olarak cevirmektedir <BR>\n");
}

#Simdi klasor yolu verilerini test edilmesi icin fonksiyona gonderiyoruz.

YK ("/etc/passwd");
YK ("dosyaadi.txt");
YK ("dir1/dir2/birveritabani.db");
YK ("../../../../../birdosya.txt");
YK (...................../....................../dosyayolu/onemlidosya1.txt");
YK ("\windows\win.ini");
YK (c:|\windows\control.ini");
YK (C:/bir/klasor/yolu/onemlidosya1.txt");

?>
</BODY>
</HTML>

2.Bu dosyayi "saglikli_yol.php" olarak kayit edin.

3.Dosyayi browserdan goruntulemek isteyince "klasorler" icin nasil bir guvenmlik sistemi kurulmus oldugunu gormus olacaksiniz.

Ornek Programlar

http://www.turk-php.com/ornekler/saglikli_yol.php

Program Nasil Calisiyor

Birinci satirda ".." dizinde ilerleme anahtari engelleniyor.

$Cikilan_Yol = ereg_replace("\.[\.]+", "" , $Girilen_Yol);

Ikinci satirda ters veya duz slash isaretlerine izin verilmiyor.

$Cikilan_Yol = ereg_replace("^[\/]+", "" , $Cikilan_Yol);

Ucuncu satida Windows ve DOS icin prefixler tanimlaniyor.(Ornegin C:\ gibi...)

$Cikilan_Yol = ereg_replace("^[A-Za-z][:\|][\/]?", "" , $Cikilan_Yol);

Dorduncu satirda bu kolu kanadi kirpilan "yol" donduruluyor...

programin bundan sonrasinin zaten gercekten anlasilmasi zor degil.

Her turlu gorus ve onerinizi yazara serkan@turk-php.com adresinden gonderebilirsiniz.

Saglicakla Kalin

Serkan Hadi Ceylani
serkan@turk-php.com

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>