09-01-2015, 05:05 AM
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:
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:
Sorgumuzu buhale getirerek kimsenin SQL’imize dokunmamasını sağlamış oluyoruz.
Bir örnek daha vermek gerekirse;
PHP Kod:
yerine;
PHP Kod:
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.
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:
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:
Kod:
$id = $_GET['id'];
$id = get_magic_quotes_gpc() ? stripslashes($id) : $id;
$id= function_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:
Kod:
$query = mysql_query("INSERT INTO makaleler(baslik, icerik, yazan) VALUES ($_POST['baslik'], $_POST['icerik'], $_POST['yazan'])", $baglanti);
yerine;
PHP Kod:
Kod:
function guvenliyap($value) { // kullandığımız kodları fonksiyon haline getirelim
$value = get_magic_quotes_gpc() ? stripslashes($value) : $value;
$value= function_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.