İPUCU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

Seçenekler

Php SQL Injection Saldırılarından Korunma

27-01-2014 23:04
#1
Moyré - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
02/2013
Nereden:
scrabble.psd
Yaş:
30
Mesajlar:
3.269
Teşekkür (Etti):
1273
Teşekkür (Aldı):
1543
Konular:
932
Ticaret:
(0) %
Merhaba Arkadaşlar ;
Bu makaleyi uzun süredir yazmak için düşünüyordum acaba PHP konusunda yeterli bilgiye sahipmiyim. Yazarsam gelecek sorulara cevap verebilirmiyim diye… Artık yazmam gerektiğini gelecek sorularınında bana tecrübe katacağına inanaraktan 2 aydır çalıştığım PHP konusunda artık birkaç makale yayınlama zamanı geldi.
İlerleyen zamanlarda PHP üzerinde daha fazla makale yayınlamaya çalışacağım.Bugün ki konumuz “Php uygulamalarımızdaki SQL Injection açıklarını nasıl kapatacağımızı anlatacağım.
Bunu ben 2 şekilde yapıyorum sizede önerim her iki şekilde uygulamalarınızı yazarken bu konulara dikkat etmeniz.
1.Yol :
Her sayfaya include ettiğimiz bir ayar.php,config.php ve/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.
[php]
$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;
}
}
}
}
[/php]

2.Yol
Urun.php {Ürünlerimizi çektiğimiz dosya}
[php]
<?php
include ‘config.php’;
$sor4=mysql_query("SELECT * FROM urunler order by id DESC ");
while($goster=mysql_fetch_array($sor4)){
$yazi = $goster["id"];
$yeniismi = $goster["yeniismi"];
$urun_adi = $goster["urun_adi"];
$icerik = $goster["icerik"];
?>
<div class="four-shop columns isotope-item">
<div class="shop-item">
<div class="resimk"><img src="resimler/<?php echo $yeniismi; ?>" alt="" width="200" height="100"/></div>
<figcaption class="item-description">
<a href="urundetay.php?id=<?=$id;?>"><h5><?php echo $urun_adi; ?></h5></a>
<span></span>
<a href="urundetay.php?id=<?php echo $yazi; ?>" class="button color">Detaylar</a>
</figcaption>
</figure>
</div>
</div>
<?php }?>
[/php]

Urundetay.php { Ürünün özelliklerini gösteren sayfamız }
[php]
<?php
include (‘config.php’);
$get=$_GET['id'];
$sorgu=mysql_query("SELECT * FROM urunler WHERE id=’$_GET[id]‘");
while ($cek=mysql_fetch_assoc($sorgu) )
{ ?>
[/php]

Urundetay.php dosyasında kullanmış olduğumuz GET methodunda herhangi bir filtreleme yapmadığımız için kötü niyetli arkadaşlar bu zafiyetten yararlanarak sistem üzerinde kafalarına göre sorgu koşturabilir. Sorgu koşturması demek veritabanında bulunan verileriçekebilir hatta veritabanını silebilir.
Örnek SQL Injection Kodu :
[php]http://www.siteadi.com/urundetay.php?id=-2145+union+ select+0,1,group_concat(table_name),3,4,5+from+inf ormation_schema.tables[/php]
Yukarıda SQL Inj. nasıl uygulandığını ve group_concat(table_name) kullanılarak tablo isimlerini bulmaya çalışabilirler.
Neyse biz daha fazla kötü örnek olmamak adına SQL Injection zafiyetinin nasıl kapatılacağına göz atalım. Bunu engellemek için kullanış olduğumuz GET methodunu filtrelememiz gerekiyor.
Ürünü çekmek için kullandığımız php kodumuzu ;
[php]
$get=$_GET['id'];
[/php]

Aşağıdaki şekilde değiştirerek id değerimizin sadece rakamlardan oluştuğunu ifade ederek engelleyebiliriz.
[php]
$id=(mysql_real_escape_string(abs(intval($_GET['id']))));
[/php]

Aşağıdaki kodumuzuda config.php veya her sayfaya include ettiğimiz veritabanı bağlantı dosyamıza yazarak SQL Injection açıklarından korunmuş oluruz.
[php]
$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;
}
}
}
}
[/php]

Umarım işinize yarar. Başka bir makale’de görüşmek üzere.
Not : Konu hakkında başka çözüm üreten arkadaşlar varsa yorum yaparak alternatifleri çoğaltabilir.


Alıntıdır.
Kullanıcı İmzası

Ya Allah, Ya Muhammed, Ya Ali!
#Solo-Türk


Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı