PHP uygulamasında güvenlik uzaktan ve yerel güvenlik endişelerini içerir. PHP geliştiricilerinin her iki karakteristiği de içine alan uygulamalar geliştirebilmeleri için sahip olmaları gereken 7 alışkanlığı bu makalede listelemeye çalışacağım.Konu güvenliğe geldiğinde, işletim sistemi ve platform güvenlik sorunlarının yanısıra kendi yazdığınız uygulamaların da güvenli olduğuna emin olmanız gerekmektedir. PHP uygulamaları yazarken aşağıdaki 7 maddeyi alışkanlık haline getirirseniz uygulamalarınızın mümkün olan en güvenli şekilde olacağına emin olabillrsiniz.* Girdiyi doğrulayın* Dosya sistemini koruyun* Veritabanını koruyun* Oturum verinizi koruyun* Çapraz-site betikleme açıklarına (XSS) karşı koruyun* Forum gönderilerini doğrulayın* Çapraz-site istek sahteciliğine (CSRF) karşı koruyun.Girdiyi doğrulayın
Konu güvenliğe geldiğinde veriyi doğulamak belki de sahip olmanız gereken en önemli alışkanlıklardan biri olmalıdır. Ve konu girdiye geldiğinde ise bu çok basittir: Kullanıcılarınıza güvenmeyin. Kullanıcılarınız muhtemelen iyi insanlardır ve muhtemelen uygulamalarınızı tam istediğiniz gibi kullanacaklardır. Ancak nerede kullanıcının veri girmesine izin verilirse, orada küçük de olsa gerçekten ama gerçekten kötü verilerin girilme ihtimali de mevcuttur. Bir uygulama geliştiricisi olarak uygulamalarınızı kötü girdilere karşı korumanız gerekmektedir. Kullanıcılarınızın girdilerinin nereye gideceğini ve netip veriler girebileceğini ince eleyip sık dokumak, güçlü ve güvenli uygulamalar geliştirmenize önayak olacaktır.Her ne kadar dosya sistemi ve veritabanı etkileşimi hakkında yazının ilerleyen kesimlerinde konuşacak olsak da, her tür doğrulamayı içine alacak genel doğrulama ipuçları bulunmaktadır:* Güvenilir değerler (white-listed values) kullanın* Sınırlı seçimleri (limited selections) daima yeniden doğrulayın* Bütünleşik kaçış fonksiyonları (escape functions) kullanın* Doğru veri tipleri için doğrulama uygulayın, numaralar gibi.Güvenilir değerler, geçerli olan veriler iken, güvenilir olmayan değerler geçersiz verilerdir. Buradaki ayrım, doğrulama yapılırken, muhtemel değerlerin listesi geçersiz değerlerin listesinden genellikle daha küçüktür ve bunlardan bir çoğu bilinmeyen ya da beklenmeyen değerlerdir.Doğrulama yaparken, tüm bilinmeyen değerlere karşı korunmaya çalışmaktansa, uygulamanın sadece izin verdiklerini doğrulamak ve bunları işler kılmak genellikle daha kolaydır. Örneğin bir alan içerisindeki değerleri tüm rakamlara sınırlamak için girdinin sadece numaralardan oluşup oluşmadığını kontrol etmek daha verimli olacaktır. Nümerik olmayan veriler üzerinde arama yapacak ve bulunması durumunda onları geçersiz olarak işaretleyecek rutinler yazmayın.Dosya Sisteminizi Koruyun
Temmuz 2000’de bir web sitesi, web sunucusu üzerinde bulunan müşteri verilerini sızdırdı. Web sitesini ziyaret eden bir ziyaretçi URL’yi, bu verileri gösterecek şekilde ayarladı. Her ne kadar dosyalar hatalı bir biçimde yerleştirilmiş olsa da, bu örnek, dosya sisteminizi saldırılara karşı korumanın önemine dikkat çekiyor.Eğer PHP uygulamanız dosyalar üzerinde herhangi birşey yaparsa ve kullanıcının giriş yapabileceği değişken bir verisi varsa, kullanıcı girdisini temizleyerek onların herhangi bir girdi ile dosya sistemi üzerinde herhangi bir şey yapamayacaklarından emin olun. Aşağıdaki kod örneği 1, isim atanmış bir imajı indiren bir PHP sitesini örneklendiriyor.Kod Örneği 1: Dosya İndirmek <");echo("title>Guard your filesystem“);
echo(“

“);echo(“

“);echo(“

“);
echo(“

“);
} Sizin de görebileceğiniz gibi Kod Örneği 1 üzerindeki görece tehlikeli olan bu betik, web sunucusunun okuma yetkisi olan her dosyayı listeleyebiliyor, bunlar arasında oturum dizininizdeki dosyalar da yer alıyor (aşağıdaki oturm verisini korumak başlıklı yazıyı okuyun) ve hatta /etc/passwd üzerindeki bazı dosyaları bile listeliyor. Bu örnek, kullanıcının örnekteki gerekçeler için veri girişi yapabileceği bir dosya adı metin kutusunu içeriyor, ancak dosya adının bir sorgu satırından (query string) oluşmaması için hiçbir neden yok.
Kullanıcı girdisi ile dosya sistemi yetkisini ayarlamak tehlikelidir, bu yüzden yapabileceğiniz en iyi şey, uygulamanızı veritabanının yanısıra gizli, oluşturulmuş dosya adları kullanacak şekilde tasarlayarak her ikisinden de kaçınmaktır. Kod örneği iki, dosya adlarını doğrulayan bir örneği içeriyor. Betik, dosya adında sadece geçerli karakterlerin kullanılıp kullanılmadığını kontrol etmek için kurallı ifadeler kullanıyor ve özellikle nokta-nokta karakterlerini kontrol ediyor: ...
Kod Örneği 2: Geçerli Dosya Adı Karakterlerini Kontrol Etmek function isValidFileName($file) {/* .. karakterlerine izin verme ve her “kelime” karakterine izin ver / */return preg_match(‘/^(((?:.)(?!.))|w)+$/’, $file);} Veritabanınızı Koruyun
Nisan 2008’de bir Birleşik Devletler Eyaleti’nin Islah Bakanlığı, SQL sütun adlarının sorgu satırlarında kullanılmasının sonucunda gizli verilerin sızmasına sebep oldu. Bu sızıntı, şüpheli kullanıcıların görüntülemek istedikleri sütunları seçebilmesinin, sayfayı gönderebilmesinin ve veriyi alabilmesinin önünü açtı. Bu sızıntı, kullanıcıların kendi girdilerinin, geliştiricilerinin önceden göremediği şeyleri nasıl yaptırmayı akıl edebileceklerini örneklendirirken, SQL enjeksiyon saldırılarına karşı önlem alınmasının önemine işaret ediyor.Kod örneği 3, bir SQL komutunu çalıştıran bir betik örneğini gösteriyor. Bu örnekte, SQL komutu benzer bir saldırıya izin verecek bir dinamik komutu içeriyor. Bu formun sahipleri liste seçimleri için sütun isimlerini limitlendirdikleri için kendilerini güvende hissedebilirler. Ancak, kod, seçimi sadece açılır kutular ile sınırlandırmanın, kullanıcının istediği herhangi bir şeyi içeren (asterisk [*] dahil) form göndermesinin önüne geçmediğini unutuyor.Kod Örneği 3: SQL komutnu çalıştırmak
SQL Injection Example