PHP ve PEAR

v0.7’de altyapıda neredeyse bütün işlerimi PEAR’a yaptırdım. Son günlerde pear’da mysql işlemleri ile ilgili sorular sorulmaya başlandı, ben de yazayım dedim, pear ile SQL işlemlerini MDB2’ye yaptırmaya yönelik 2 döküman yazdım. İkincisi diğerinin devamı gibi oldu ama ana konu sql injection’dan kaçmak. Yine de vermem gereken bilgileri verdim 🙂

Pear’da MDB2 ile veritabanı işlemleri
PEAR ve MDB2 ile “Prepare & Execute” sayesinde SQL injection saldırılarına karşı koymak

PEAR ve MDB2 ile “Prepare & Execute” sayesinde SQL injection saldırılarına karşı koymak

PEAR’da MDB2 ile veritabanı işlemleri hakkında daha önce döküman yazmıştım (aynı anda yayınladım gerçi). MDB2 ile veritabanı işlemleri ile ilgili bilgi edinmek için https://mfyz.com/tr/pear-da-mdb2-ile-veritabani-islemleri/ dökümanını okuyun. Bu dökümanda veri işleme ile ilgili kısımlardan bahsetmeyeceğim.

SQL injection, başımızın belası 🙂

SQL injextion saldırılarını çok duyuyoruz. Çok da yeni bir şey değil aslında. Fakat çok büyük sitelerde, devlet siteleri, ticari siteler vs. Dikkatsiz programcılar veya dikkatsiz programlama sonucu bu saldırılara kurban gidiyor. Her gün bir yerlerin “hack”lendiğini görüyoruz. Muazzam işler yapmaya gerek yok bu saldırıları yapmak için.

Aynı şekilde bu açıkları vermemek için de muazzam önlemler almanıza gerek yok aslında. Bütün olay kullanıcın girdiği metinleri işlerken ve ekrana basarken kontrollü basmakta yatıyor bu injection, xss saldırılarının altyapıları. Sitenizde sql’inize veya htmlinize enjekte etmek istedikleri şeyleri aslında sizin tırnaklarla sınırladığınız alandan kaçarak başarıyorlar. Tabiki herşey tırnakta çözülmüyor fakat dananın kuyruğunu kopardıkları yer sizin sınırlandırdığınız noktadan kaçabilmekte 🙂 Yani Hex kodları ile tırnak veya özel karakterler girilmeye çalışıyor, tırnaklar kullanılıyor veya ascii, htmlentity, htmlencode ile özel karakter girmeye çalışılıyor. XSS konusunda burada bahsetmeyeceğim.

SQL injection için eğer pear ve mdb2 kullanmıyorsanız, kullanıcıdan gelen string türü verileriniz için mysql’de mysql_real_escape fonksiyonunu kullanabilirsiniz. Metinlerinizi bu fonksiyondan geçirip sqlinize sokun. Eğer MDB2 kullanıyorsanız Preapre ve Execute fonksiyon grubu ile uygulatmak istediğiniz sql cümlenizdeki değişkenleri işletmeden önce veri türüne göre güvenli hale getirebilirsiniz.

Aslında tek görevi güvenlik değil bu fonksiyonların. Asıl amaç veritabanına doğru türde veri göndermek. Aynı zamanda tek sql’i tekrar tekrar yazmadan birden fazla çalıştırmanızı da sağlıyor. Güzelliklerine az sonra değineceğim 🙂

MDB2’de bir sorguyu işletmek için

query fonksiyonunu kullanıyorduk. Diyelim ki 15 tane alanınız var ve hepsini “insert” sql cümlenizde kullanıyorsunuz. query fonksiyonu ile bir sürü tırnak ve değişkeni cümleye dönüştürmek için karışık bir kod yazacaksınız. tek satır görünümünde ama 4-5 satır uzunluğunda birşey olacak 🙂

Prepare ve execute fonksiyonlarını aşağıdaki örnekle açıklayayım.

gördüğünüz gibi 2 satırda hallettik işimizi.

$sorgu değişkenine bir sql hazırlıyoruz. Yapılan şey cümle olarak sql cümlesini sunmak, değerlerimizin yerine tırnak fln koymadan doğrudan soru işareti (?) koyuyoruz. prepare fonksiyonuna ikinci paramere olarak, dizi şeklinde veri türlerini veriyoruz. Veri türlerini string olarak elle yazıyoruz ve sorguda hangi sırada ne tür değişken olduğunu açıklıyor bu kısım aslında. Sonuçta $sorgu değişkeninde bir sql cümlesi duruyor, hangi alanlara hangi TÜR veri girileceği belirlenmiş şekilde. Amaçda bu zaten, yani alanlarımıza istemediğimiz türde veri sokmamak. Veri türleri hakkında detaylı bilgi için http://pear.php.net/manual/en/package.database.mdb2.datatypes.php adresini ziyaret edin.

İkinci satırdaysa hazırlanmış sql’i işletiyoruz. Tabiki dizi olarak VERİ’lerimizi veriyoruz execute fonksiyonuna. execute fonksiyonu da $sorgu nesnesinin bir özelliği tabiki. Yani prepare olmamış bir sql execute edilemez. Hata verir. Hatta böyle bir fonksiyon yok der 🙂

İşin güzelliğini örnekle açıklayayım :

söze gerek var mı?

text tipi alanlara otomatik olarak sql injection için kaçmak amacıyla kullanılan özel karakterler dönüştürülüyor. Zaten text dışındaki alanlara herhangi bir string veri kaydedilemiyor. Yani herşey kontrol altında.

Eğer sql cümlenize katacağınız HERHANGİ bir değişken kullanıcı kontrolüyle geliyorsa prepare & execute yöntemini kullanın. Eğer uygulamanızda basit bir sql işlemi kullanıyorsanız işinizi query ile halledebilirsiniz.

Konu hakkında mdb2 manual’da ki bilgiye de göz atmanızı öneririm http://pear.php.net/manual/en/package.database.mdb2.intro-execute.php

Ubuntu’da Apache, Php, MySQL ve PHPMyAdmin kurulumu (LAMP)

Bildiğiniz gibi ubuntu debian tabanlı bir işletim sistemi ve apt denilen kesinlikle gördüğüm en mükemmel paket yöneticisi olan bir araca sahiptir. Apt denilen şey sayesinde internetteki çok fazla depodan istemeyeceğiniz kadar pakete karın ağrısız ulaşabilmenizi sağlıyor. Bu aygıtı kullanıp harikalar yaratacağız şimdi.

Başlamadan önce paket bilgimizi güncelleyelim;

İlk olarak normal web yayını yapacak olan Apache’yi kuralım;

komutu ile apache2 ve buna ilişkin paketleri kurun.

Öneri olarak apache’nin varsayılan web yayın klasörünü kullanmayın, benim / dizinimde mfyz adında bütün kişisel dosyalarımı sakladığım bir merkez vardır (hatta ayrı disk bölümü şeklinde kullanırım). Bu dizin içerisinde kendime “www” adında bir dizin oluşturup burayı apache’nin ana yayın dizini olarak ayarlayacağım :

komutu ile (veya nano ile açabilirsiniz) geçerli yayınlanan domainlere ilişkin bilgilerin tutulduğu dosyayı açalım. Burada varolan yayındaki site ayarları göreceğiz,

“/var/www” gördüğümüz 2 yeri değiştiriyoruz, “/mfyz/www” şeklinde ayarladıktan sonra yine önereceğim;

satırındaki Indexes kısmını kaldırıyoruz. Bunu yapmamızdaki amaç şudur : Apache eğer bunu yapmazsanız içerisinde index dosyası bulmadığı dizinleri basit bir yapıda listeleyecektir. Bunu kapatmak için burada bulunan “Indexes” kısmını kaldırıyoruz. Artık index olmayan bir dizine bakılmaya çalışıldığında Forbidden hatası verecektir. Dosyayı kaydedip çıkıyoruz.

Web sunucusu ve modüllerine ilişkin yaptığımız her değişimde apache servisini yeniden başlatmamız gerekmektedir. Çünkü her başlangıçta o andaki ayar dosyaları hafızaya alınır ve oradan çlaışır servisler, Yeni ayarları uygulamak için :

veya

komutlarından birini veriyoruz (ikisi de aynı işi yapar).

Şimdi bir web tarayıcısı açıp http://localhost yazdığımızda Forbidden hatası alıyorsak apache servisimiz sorunsuz çalışıyor demektir. Eğer /mfyz/www klasörüne bir index.html dosyası koyarsak görünmesi gerekir aynı zamanda.

Şimdi php yükleyip apache ile entegre edelim:

İsterseniz 4 olan yerleri 5 yaparak php5 kurabilirsiniz. Bu örnekte php4 kuracağım.

komutu ile php4, mod-php4, php’ye gd kütüphanesi desteği ve mysql ile entegre çalışabilmesi için php4-mysql paketlerini kurmuş oluyoruz.
Kurulumdan sonra php ayarlarımızı yapmak için:

komutu ile php.ini dosyamızı açıyoruz. Burada önerdiğim birkaç ayarı yapalım :

satırını 20M şeklinde düzenleyerek en fazla 20mb upload yapılabilir hale getirelim. Bu değişim, büyük veritabanlarını phpmyadmin’e import ederken işimize yarayacak.

satırını buluyoruz ve başındaki ; işaretini kaldırıyoruz (uncomment). Daha sonra utf-8 olarak ayarlıyoruz.

[Extensions] kısmında varolan ;

satırlarının başındaki ; işaretlerini kaldırdıktan sonra kaydedip çıkıyoruz. Böylece Türkçe sorunu yaşamadan en fazla 20mb upload edebilir ve mysql/gd destekli bir php desteğine sahip apache edinmiş oluyoruz.

Eğer register_globals kullanıyorsanız bunu açmanız gerekecektir. Varsayılan olarak Off ayarlı olacaktır.

Not : Yukarıdaki ayarlar dışındakilere dokunmayın, hepsi varsayılan olarak gayet ideal ayarlanmıştır.

Şimdi apache’yi yeniden başlatıp deneme yapalım.

komutu ile index.php oluşturalım ve içine

yazıp kaydedip çıkalım. Şimdi bir web tarayıcısı açıp http://localhost adresine girin, PHP hakkında çok detaylı bir sayfa görüyorsanız tebrikler şu an php apache sorunsuz çalışıyor. Bu sayfada başlıklara bakarak aşağıya doğru süzülün, gözünüz “mysql” ve “session” başlıklarını görüyorsa devam edebiliriz.

Şimdi MySQL kuralım;

komutu ile mysql sunucumuzu ve istemcimizi kurmuş oluyoruz. Şimdi mysql root şifresi ayarını geçiyorum çünkü bunu phpmyadmin’den yapacağız. Varsayılan olarak root şifresizdir.

Apache’yi tekrar başlatıyoruz tabiki.

Sıra geldi phpmyadmin kurulumuna

Apt ile kurmanızı önermem çünkü phpmyadmin’i sürekli güncellemeyeceğiz hatta kodda kendimize göre değişiklikler yapacağız.
Otomatik kurmak isteyenler ;

Elle kurmak isteyenler: http://www.phpmyadmin.net adresine girip son sürüm paketi indirin.

/mfyz/www klasörüne “pma” adında açalım (isteyen phpmyadmin olarak da adlandırabilir klasörü, ben böyle daha pratik olduğunu düşünüyorum).

Şimdi ayar dosyasına dokunmadan http://localhost/pma adresine giriyoruz. PhpMyAdmin gayet normal bir şekilde açılıyor karşımıza. Şimdi hiç bi yere tıklamadan anasayfadaki “Privilages” linkine tıklıyoruz (Türkçesinde izinler olarak geçebilir). Burada MySQL kullanıcıları listelenecektir. root’a tıklayıp düzenlenme sayfasındaki şifre kısmında 2 kez girerek formu gönderin. Sayfayı yenileyin, yani http://localhost/pma adresine tekrar girmeye çalışın. Eğer erişim hatası veriyorsa root şifreniz değişmiştir. Şimdi /mfyz/www/pma/libraries dizinindeki config.default.inc.php dosyasını düzenleyerek root şifrenizi ayarlayın. Tekrar http://localhost/pma sayfasına girmeyi deneyin. Eğer giriyorsa artık apache php mysql phpymadmin’iniz sorunsuz kullanılabilir demektir. /mfyz/www klasöründe çalışabilirsiniz. MySQL veritabanı yönetimini A’dan Z’ye phpymadmin ile yapabilirsiniz, Sadece biraz kurcalayın göreceksiniz 🙂

Not: Benzer komutlar ile debian ve debian türevi tüm işletim sistemlerinde bu dörtlüyü kolayca kurabilirsiniz.

PHP nedir? PHP’ye nereden ve nasıl başlamalı?

PHP Nedir?

PHP sunucu tabanlı html içine gömülmüş (html-embed) bir betik(script) dilidir. Daha açık bir anlatım ile, internetteki forum, anket, oyunlar, mesaj tahtaları gibi kullanıcının aktif bir şekilde müdahalede bulunduğu yapıları oluşturmaya yarayan web programlama dillerinden biridir. PHP ile inanılmaz yetenekli, yazılımsal sayfalar oluşturabilirsiniz. Örnek olarak burada dökümanlara puan verebiliyor, kaç kişinin okuduğunu görebiliyorsunuz. Veya forumda istediğinizi yazıp cevaplar alabiliyorsunuz. Bunlar dinamik olarak kullanıcının hareket/isteklerine göre değim gösteriyor. Bunlar php ile yapabileceğiniz basit uygulamalar. Çok daha karmaşıklarını da görmüşsünüzdür/yapabilirsiniz. PHP dili C, Java ve Perl dilleri üzerinde geliştirildiğinden bu dilleri bilen arkadaşların php’yi öğrenmeleri zor olmayacaktır.

PHP’ye Nereden Ve Nasıl Başlamalı?

PHP’ye bence başlamanın iki yolu var. Eğer zaman çok önemli değilse, internetteki makaleleri inceleleyerek bol bol basit ve fonksiyonel kodlar yazmak. Bu sayede kodlardaki hatalarla uğraşırken, farklı yöntemler ararken inanılmaz bir pratik ve php bilgisi kazanırsınız. Kendiniz kodlar üreterek de php’yi daha iyi sindirerek öğrenmiş olursunuz.
İkinci yol ise zamanı kısıtlı ve/veya bir an önce öğrenmek isteyenlere… Öncelikle bir kitabevine gidip 1-2 saat php kitaplarını inceleyin. Aralarında en güzel ve en kolay öğreneceğinizi düşündüğünüz kitabı alın. Aslında kapağını sevmeniz bile yeterli. Zira hepsinin içeriği hemen hemen yakın ve giriş seviyesi için teorik bilgi dışında çok fazla uygulama içermiyorlar. Kitaptakileri teker teker uygulayın. Örnek kodları yazarak işin püf ve teorik genel kısımlarını öğrenmiş olursunuz. Bundan sonra internetteki makaleleri okuyarak php’nin içine girebilirsiniz. Kitapta öğendikleriniz php’nin “p”sini bile oluşturmaz. Çünkü php açık kaynak bir dil olduğundan, sürekli yeni kütüphaneler, her yeni kütüphane içinde yüzlerce yeni fonksiyon gelir. Şu anda php manual’daki fonksiyonların sayısı benim göz kararım ile 3-5 bin civarındadır. (Sadece listeye bir göz atmıştım.) Bu fonksiyonların hepsini öğrenmek için ne beyin dayanır ne de göz. İşinize yarayacak kütüphaneleri ve fonksiyonları öğrenmeniz için php ile neler yapılabilir? sorusunun yanıtısı iyi bulmanız gerekir.
PHP ile önereceğim kısımlar şimdilik bunlar; her iki yolda da interneti iyi kullanıp php manual’ı iyi kullanmanızı öneririm.