Navigate / search

PHP Injection Açıklarını Kapatma ve Saldırılardan Korunma

Merhabalar ;

PHP Injection saldırı ve tehtidlerinden korunmak için bir kaç farklı yol mevcut. Bu yazıda size bunların bir kaçını göstereceğim.

Bunu ben 2 şekilde yapıyorum sizede önerim her iki şekilde uygulamalarınızı yazarken bu konulara dikkat etmeniz.

1.Yol :

Site geneline dahil ettiğimiz bir connection.php,config.php veya veritabanı bağlantısı için kullandığımız bir bağlantı dosyamız mevcuttur. Bu dosyanın içinde aşağıdaki kodları ekleyerek get methodumuza gelecek select insert gibi sorguları filtreleyebiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
$inj = array (‘select’, ‘insert’, ‘delete’, ‘update’, ‘drop table’, ‘union’,null, ‘SELECT’, ‘INSERT’, ‘DELETE’, ‘UPDATE’, ‘DROP TABLE’, ‘UNION’,NULL,’order by’,’order by’);
for ($i = 0; $i < sizeof ($_GET); ++$i){
for ($j = 0; $j < sizeof ($inj); ++$j){
foreach($_GET as $gets){
if(preg_match (/. $inj[$j] ./, $gets)){
$temp = key ($_GET);
$_GET[$temp] =;
exit(<iframe title="YouTube video player" width="800" height="600" src="https://www.youtube.com/watch?v=_bfDT2RA7r0" frameborder="0" allowfullscreen></iframe>);
continue;
}
}
}
}

2. yolumuz ise şöyle;

Aşağıdaki kodu kullanarak get ve posttan gelen verileri temizleyebilirsiniz. Ama bu şekilde kullanırsanız göndermek istediğiniz zararsız verilerden bazılarınıda temizleyebilir :)

1
$injectcheck = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$injectcheck);

3. olarak bahsetmek istediğim yol gelen verileri yine kontrol ederek. Örneği gelen sayfa id’si INT mi ?

erhangi üyenin detaylarını gösteren bir sayfa düşünün;
x.php?uyeid=1 ( Bu adres 1 no”lu uyenin bilgilerini gostersin )

1
2
$id = mysql_real_escape_string($id);
$sorgu = "SELECT isim,soyad,bla,bla FROM uyeler WHERE id = $_GET[id]";

Eminim birçoğunuz zaten yukarıdaki kodun yeterince güvenli olduğunu düşünüyorsunuz fakat değil.Mysql 4.x ile birlikte mySQL union select destegi vermeye başladı.

Saldırganın tekinin ?id=-1 UNION SELECT 0,uye,parola FROM uye olarak istek yaptığını düşünsenize..Birinci – asıl – select sorgusu herhangi bir sonuç döndürmeyeceği için dönen sonuclar saldırganın girdigi union select içindeki alanlar olacaktır.

Dikkatinizi çektiyse tırnak kullanmadan böyle bir saldırı yapılabiliyor, dolayısıyla bu nokta dikkat edilmesi gereken bu tip id tarzı bilgileri sorguya alırken veri tipini kontrol etmek.

Bunu (int)$degisken veya intval($degisken); seklinde yapabilirsiniz.Ya da is_integer, is_numeric gibi fonksiyonlarla kontrol edip gerekli manual try/catch mekanizmasını kurabilirsiniz.

Ya da bu tür değerleri tırnak içine alarak saldırganın işi zorlaştırılabilir.(where id = “$id” gibi) Zira, bu durumda saldırgan union select sorguları sokabilmek için ilk önce ilk SELECT sorgusunu bitirmek zorunda kalacak ve UNION SELECT yazmadan önce ” karakterini yazacak.Fakat mysql_real_escape_string burda devreye girip ” karakterini escape edeceği için olası saldırılar geçersiz hale gelir.

Yani daha güvenli bir kod aşağıdaki gibi olacak;

1
2
$id = intval($_GET["id"]);
$sorgu = "SELECT * FROM uyeler WHERE id = "$id" ";

PHP For Döngüsü ve Kullanımı

PHP For Döngüsü ve Kullanımı.
Yazdığımız program içerisinde kullandığımız döngülerin bazılarında kaç kere döneceğini belirlememiz gerekebilir.For döngülerinde döngü sayısını kolaylıkla belirleyip döngümüzü çalıştırabiliriz.
For döngülerinde değişkenin arttırma yada eksiltme işlemlerini döngü kendi kendine yapar.Böylece sonsuz döngüye düşme riskimiz azalmış olur.
For döngüsünde kullandığımız bir kaç parametremiz vardır.Bunlar Değişken,Koşul ve Artış Basamağıdır.

For Döngü Yapısı:

for ( $degisken ; koşulumuz ; Artış Basamağı ) {
	Koşul gerçekleşene kadar yapılacak olan komutlar
	}

Gördüğünüz gibi for döngüsünde bir kaç parametre kullandık ve bu parametreler arasında noktalı virgül kullandık.İlk parametremiz değişkenimizdir.Bir değişken ismi belirleyip buna değer veririz.Daha sonra değişkenimizin döngüyü bitirmesi için gerekli koşulu belirleriz.Daha sonra ise değişkenin kaçar kaçar azalacağı yada artacağını belirleyen kodumuzu yazarız.Şimdi bir örnek yapalım ve for döngüsünü daha iyi kavrayalım.

1
2
3
4
5
6
7
<?php
	for ($sayac = 1; $sayac <= 7 ; $sayac++ ) {
	print ("<font size= $sayac >");
	print ("<b><p>Şafak Bilişim PHP Dersleri</b></p>");
	print ("</font>");
	}
?>

PHP Do While Döngüsü

Do While Döngüsü ve Kullanımı.
Bir Önceki dersimizde anlattığım While döngüsüne benzer yapıdadır.While döngüsü ilk önce şartı sınar ve şart geçerliyse döngüyü döndürmeye başlar. Fakat Do..While döngüsünde, döngü içine yazdığımız komutlar ilk önce bir kere çalıştırılır.Döngü içindeki komutlar bittikten sonra döngü lartı sorgulanır ve şart geçerliyse döngü dönmeye devam eder.Yani döngü içindeki kodlar mutlaka bir kere çalıştırılır.

Do..While Kullanımı

do {
	Döngü içindeki kodlarımız
	}
	while (koşulumuz);

While döngüsünde olduğu gibi bu döngüde de sonsuz döngüye düşmemeye özen göstermeniz gerekmektedir.
Do..While Örneği

1
2
3
4
5
6
7
8
$sayac = 1;
	do {
	     print ("<font size= $sayac >");
	     print ("<b><p>Php İle Do..While!</b></p>");
	     print ("</font>");
	     $sayac ++;
	}
	while ( $sayac <= 7 ) ;

PHP While Döngüsü

While döngüsü belirlediğimiz değişkenin istediğimiz değere gelince kadar {} işaretleri arasında yazdığımız komutları işlemeye devam eder.Yani belirlediğimiz şart gerçekleşene kadar komutlarımız işlenmeye devam edecektir.Yanlız while döngüsünde dikkat etmeniz gereken önemli bir nokta vardır.{} işaretleri arasına yazdığımız komutlar içinde değişkenimizi arttıracak, azaltacak yada değiştirecek komutlar kullanmamız gerekmektedir.Şayet kullanmaz isek while döngüsünde belirttiğimiz şart hiç gerçekleşmeyecek ve programımız kısır döngüye girerek program akışı duracak ve hatta browserımızı kitleyecektir.

While Komutu Kullanımı

while (koşulumuz)  {
	              Koşul doğru ise işleve girecek komutlar
	      }

Şimdide While Komutu Örneği Görelim

1
2
3
4
5
6
7
8
9
<?php
	$sayac = 1;
	while ( $sayac <= 5 ) {
	     print ("<font size= $sayac >");
	     print ("<b><p>Döngülerle PHP</b></p>");
	     print ("</font>");
	     $sayac ++;
	}
?>

Döngümüz için bir $sayac değişkeni belirledik ve “1″ değerini verdik.While döngüsünde sayac değişkenimiz 5′ten küçük yada 5′e eşit olana kadar döngümüzü sürdür dedik.Bunu while ( $sayac <= 5 ) komutuyla programımıza söyledik.Daha sonra döngü içine komutlarımızı yazdık ve sonunda $sayac ++ komutuyla değişkenimizi her döngü de bir arttırmasını söyledik.Ve böylece belirlediğimiz şarta kadar döngünün dönmesini sağladık.

PHP’de Döngüler

Her rogramlama dilinde olduğu gibi PHP dilininde de döngülere ihtiyacımız vardır.Döngü kelimesini kısaca açıklayacak olursak “Yazılan kodların belirli bir sayıda tekrar işlenmesidir”.Yazdığımız program içinde kodlarımızı birden fazla kullanmamız gerekebilir.Bu yüzden döngülere ihtiyacımız vardır.Yüzlerce kez arka arkaya yazmamız gerek komutlarımızı bir kaç satırda döngü kullanarak rahatça yapabiliriz.

Döngüler için bir çok farklı komut olsada döngü çeşitleri 2 ye ayrılır.Yani sadece iki farkli türde döngümüz vardır.Bunlardan biri belirtilen bir durum devam ettiği veya devam etmediği süre boyunca yapılan veya tekrar sayısı belli olup bu sayı boyunca komutlarımızı işleyen döngü.

Döngülerde kullanabileceğimiz while, do…while, for, foreach gibi komutlarımız vardır.Herbirini örneklerle sonraki derslerde anlatacağım.