MyBB Destek Forumu

Orjinalini görmek için tıklayınız: SQL’de Kabus, SQL Injection!
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba arkadaşlar, PHP’ye ilk başladığım zamanlar en çok yaptığım bir hatayı ve bunu nasıl düzelteceğimizi anlatmak istedim. Eğer PHP yazıyorsanız, ilk başta öğrenmeniz gereken önemli noktalardan birisidir, aksi taktirde bütün emekleriniz boşa gidebilir.

SQL injection denen method ile, veritabanınıza yetkisiz işlem yaptırılabilir. Bu yetkisiz işlemler ile, veritabanınızdaki bir tablo tamamen boşaltılabilir, veriler silinebilir veya veri eklenebilir, daha da kötüsü yazdığınız script bir yönetim paneline sahipse buraya izinsiz girişler olabilir.


SQL injection methodları farklılık gösterebilir, URL ile yapılabilir(GET), sitedeki formlar ile yapılabilir(POST). Temel mantığı ise, sizin yazdığınız SQL sorgularını safdışı bırakarak çalıştırılmak istenen sorguların çalıştırılmasıdır. Burada bu methodları tabi ki anlatmayacağım, bunun yerine PHP’de SQL injection’a karşı nasıl önlemler alabileceğimizi anlatacağım.

Basit bir SQL sorgumuz olsun, url ile gelen id’ye sahip makaleyi veritabanından seçelim.

PHP Kod:
$query mysql_query("SELECT * FROM makaleler WHERE id=$_GET['id']"$baglanti); 

Bu şekilde kullandığınızda, çok büyük bir tehlike içerisindesiniz demektir. Bu sorguyu güvenli hale getirmek için sprintf fonksiyonunu da kullanacağız(bunu sadece daha düzenli bir kod yazımı için kullanıyoruz) ve sorgumuzu aşağıdaki hale getireceğiz:

PHP Kod:
$id $_GET['id'];
    
$id get_magic_quotes_gpc() ? stripslashes($id) : $id;
    
$idfunction_exists("mysql_real_escape_string") ? mysql_real_escape_string($id) : mysql_escape_string($id);
    
$query mysql_query(sprintf("SELECT * FROM makaleler WHERE id='%s'"$id), $baglanti); 

Sorgumuzu buhale getirerek kimsenin SQL’imize dokunmamasını sağlamış oluyoruz.

Bir örnek daha vermek gerekirse;

PHP Kod:
$query mysql_query("INSERT INTO makaleler(baslik, icerik, yazan) VALUES ($_POST['baslik'], $_POST['icerik'], $_POST['yazan'])"$baglanti); 

yerine;

PHP Kod:
function guvenliyap($value) { // kullandığımız kodları fonksiyon haline getirelim
$value get_magic_quotes_gpc() ? stripslashes($value) : $value;
$valuefunction_exists("mysql_real_escape_string") ? mysql_real_escape_string($value) : mysql_escape_string($value);
return 
$value;
}

$query mysql_query(sprintf("INSERT INTO makaleler(baslik, icerik, yazan) VALUES ('%s', '%s', '%s')"guvenliyap($_POST['baslik']), guvenliyap($_POST['icerik']), guvenliyap($_POST['yazan'])), $baglanti); 

kullanarak güvenliğimizi sağlamış oluyoruz.

Kısacası, URL veya POST ile gelen bütün verileri bir filtreden geçirerek, bu gelen verinin içinde bulunabilecek işaretlerini \’ haline getiriyoruz. Böylece bu gelen verilerdeki zararlı işaretler, sorgumuzun içine karışmıyor ve SQL injection ile sitemize zarar vermek isteyen kişiler avuçlarını yalıyorlar. Göz Kırp

Kaynak:
Kod:
http://www.t-infection.com/sqlde-kabus-sql-injection/
Kaynak adres ilk mesaja eklendi, teşekkürler.. Utangaç

Kod:
http://www.t-infection.com/sqlde-kabus-sql-injection/