Php Sql Injection Engelleme Kesin Çözüm

Php Sql injection engelleme için kesin bir çözüm var. htmlspecialchars, stripslashes, mysql_escape_string, strip_tags sizi her zaman doğru biçimde korumaz. Yaratıcı injection girişimlerine karşı özelleştirilebilir ve aynı zamanda genel-geçer bir güvenlik kalkanı oluşturmalıyız.

Mysql injection ile uğraşmış herkes, bu işlemin temelde get veya post yöntemiyle yapıldığını bilir. Site üzerinde gerçekleştirilecek bu veri giriş çıkışı, adres satırı işlemleriyle tablo yapısı hakkında bilgiye ulaşıldıktan sonra, tabloya ilgili SQL komutları gönderilir. Bunu engellemenin, sitenizi hackerlardan uzak tutmanın (site bazında) tarafımca denenmiş ve başarılı bir yöntemi var. Bu çözümü WordPress dahil tüm Php tabanlı yazılımlarınızda kullanmanızı tavsiye ederim. Böylece Sql saldırılarından kurtulabileceksiniz.

Atmamız gereken ilk adım “guvenlik.php” adlı bir Php dosyası oluşturarak bu dosyayı tüm PHP dosyalarınızın en üst kısmına include etmek.

Bu include içeren kod satırının Php dosyalarınızın en üstünde olması elzemdir. Eğer bu satırdan önce  Mysql bağlantısı gibi bir kod satırı kullanmışsanız güvenlik kodlamamızın yararsız olabileceğini unutmayın. Ayrıca Mysql içeren (bağlantı/sorgu vb.) her Php dosyası için bu satırın en tepede olması gerekiyor. Şimdi guvenlik.php dosyanızı açıp aşağıdaki adımlara geçebilirsiniz.

GET SQL Injection Saldırıları İçin Güvenlik Sağlayalım

Adres satırından yapılan saldırılar en bilindik ve yaygın olanları. Adres satırından hiçbir veri okutmuyorum diye avunmanız doğru değil. Ortalama bir hacker Mysql işlemlerini adres satırından kolayca yapabilir. Üstelik ?id=12, ?ara=beybut şeklinde okutmalar kullanıyorsanız kesinlikle risk altındasınız. Bu hacking girişimlerini engellemek için Get yöntemine özel bir çözüm üretelim.

Burada $yasaklar karşısında, ¿¿ ile ayırarak belirttiğimiz girdilerden biri adres satırında mevcutsa kişiyi bir resme yönlendirdik. $yasaklar bölümünü tablo, kolon adlarınızı da yazarak güçlendirebilirsiniz. Bu yöntemle ?ref türü, adres satırıyla ilişkili tüm saldırılardan kurtulabilirsiniz. Eğer ayracı (¿¿) beğenmediyseniz bunu değiştirmeniz mümkün.

Hacker, sql injection denediğinde karşısına aşağıdaki resim gelecek.

Hacker Bey
Hacker Bey

Aynı yöntemi POST için de uygulayalım.

POST ile SQL Injection Saldırıları İçin Güvenlik Sağlayalım

Post güvenliği için en elzem konu bütün tablolarınızı aşağıdaki biçimde belirtmenizdir. Çünkü post verilerinde <, >, ‘ gibi karakterler sıkça kullanılır. Bunları engellemek doğru bir yöntem değildir. Bunun yerine hackerın ihtiyacı olan veya tahmin edeceği tüm tablo adlarımızı kontrole ekleyeceğiz. Tablo adı girilmemiş bir SQL sorgusunun çalışmayacağını söylemeliyim. Aşağıdaki örnekteki tablo adlarını Mysql yapınıza göre değiştirmelisiniz.

Her şey tamamsa artık GET veya POST Sql injection yöntemiyle hacklenemeyecek, verilerinizin değiştirilemeyeceği, silinemeyeceği bir web sitesine sahip oldunuz demektir.

Önemli noktalar:

  1. guvenlik.php her PHP dosyanızda (Sql içeren), en tepede include edilmeli.
  2. Tablo adlarınız mutlaka ilgili satırlarda bulunmalı.

 

Php İle Gelişmiş Sansürleme

Php ile sansür – yasaklama fonksiyonu, istenmeyen girdilerin engellenmesini, bu tür girdiler varsa sonraki işleme geçilmemesini sağlar. Bu fonksiyon, yorum bölümlerinde, gerçek zamanlı sohbet uygulamalarında, gönderilen verilerin güvenlik denetiminde ve buna benzer pek çok Php uygulamasında kullanılabilir.

Fonksiyonun belirli sözcükleri engelleyen bir işlevden daha fazlasına sahip olmasını; yapay zekasının benzerlerinden bir nebze daha gelişmiş olmasını istiyorum. Tabi burada işin içine deneyim giriyor. Sansürle korumasıyla karşılaşan bir kişi farklı biçimde korumayı aşmayı deneyecek; örneğin “kafir” yerine “k4fir” , “k4f1r” veya “K 4 F İ R” yazacaktır. Bu yazım türlerinin tümünde kişinin söylemek istediğinin “kafir” olduğunu anlayabiliyoruz. O halde uzunca bir str_replace koşusu bizi bekliyor.

Öncelikle yasaklamak istediğimiz sözcük listesini belirleyelim. Burada birkaç hakaret sözcüğünü Türkçe karakter kullanmadan , virgülle ayırarak ve boşluk bırakmadan belirliyorum. Siz bu listedeki sözcükleri çoğaltmalısınız.

Dört adet sansürlü sözcük belirledim. Bunlar; şerefsiz, utanmaz, eroinman ve faşist sözcükleri. Burada sözcüğün tamamını yazmak yerine, örneğin şerefsiz için “serefs” kullandım. Çünkü şerefs… başlangıcından sonra, şerefsiz dışında türetilebilecek başka bir sözcük bulunmuyor.

Sansürleme fonksiyonumuzu oluşturalım.

Girdiyle gelen veri sansür listemizde bulunuyorsa bunu ters soru işaretiyle (alt+168) değiştirecek.

Sansür kontrolüne tabi tutulacak bir cümle girdisi oluşturalım.

Sansür listemizde bulunan eroinman sözcüğünün garip yazılmış biçimini girdi içerisinde geçirdik. Amacımız, sansür fonksiyonunun bu karmaşık “hakaret”i tespit edebilecek yetiye sahip kılınması.

Özel karakterleri sansür listemize uygun harflere çevirmek için kullanacağımız fonksiyon aşağıdadır.

Son kontrolleri yaparak sansürlü sözcük varsa bir mesaj verdirelim.

Bu kadar. Bu sansürleme fonksiyonu, bir girdide geçen, belirlediğimiz sansür sözcüklerini tespit edip; eğer sansürlü bir sözcükle karşılaşırsa mesaj verir. Bu tür bir sansürleme, yasaklı sözcükleri yıldızla kapatmak yerine girdiyi uygunlaştırarak topyekün bir kontrole tabi tutar. Özellikle güvenlik gerektiren alanlarda, saldırgan tavırlı kullanıcıları engellemek için etkili bir sansürleme işlevi.

Zaafiyetleri: Kod bloğu bazı sözcük gruplarını gereksiz olarak yasaklayabilir. Örneğin “Şeref size gelecek.” cümlesinde uygunlaştırılmış kontrol yapısı “serefsizegelecek” olduğu ve sansür listemizde “serefs” girdisi bulunduğu için bu tümce yasaklı sayılacaktır. Ancak sansür fonksiyonu “Ş e r  e f s  i  z” sözcüğünü de engelleyebileceği için, boşluklara izin vermek güvenlik zaafiyeti doğuracaktır.