R10 patlamadan önce bir yazı yazmıştım bununla ilgili. Klasik olarak Google'a sql injection yazıp aratsan milyonlarca örnek ve çözüm bulabilirdin demek istiyorum. Bu çok klasik ve kolayına kaçmak gibi görünse de doğrusu bu.
Neyse konuya dönelim.
SQL Injection, daha çok veritabanı sorgularıyla ilgili bir açık. Fazla konuşmadan örnek vereyim.
Mesela kodların/sorgun şu şekilde:
$id = $_GET['id'];
mysql_query("SELECT * FROM kullanicilar WHERE id='$id'");Eğer get ile aldığın veriyi direkt olarak sorgunun içine dahil edersen neler olacak şimdi görelim.
Diyelim ki id değeri 10
mysql_query("SELECT * FROM kullanicilar WHERE id='10'");Sorunsuz bir sorgu oldu. Ama diyelim ki get ile aldığımız veri 10' olarak gönderilmiş. Bu kez ne olacak?
mysql_query("SELECT * FROM kullanicilar WHERE id='10''");Sorun oluşacak. Bu şekilde sitenize saldıranlar çeşitli saldırılar yapabilecekler. Bu açığı kapatmanız lazım. Çok şey yapmanıza gerek yok. Bunu kapatmak için tek yapmanız gereken şu.
" ve
' işaretlerini süzmek. İster toptan yokedin bunları isterseniz de başka değerlere çevirin. Ama sözkonusu mysql sorgusu olduğuna göre mysql connect kullanmışsınızdır. Bu durumda
mysql_real_escape_string fonksiyonu bulunmaz nimet. Tek yapacağınız şu.
$id = mysql_real_escape_string($_GET['id']);
Böylece mysql sorgularına aykırı olabilecek her türlü girdi süzülecek, düzenlenecek ve $id değişkenine öyle atanacak. Sorun ortadan kalktı.
Tam olarak SQL Injection olmasa da benzer bazı zararlı durumlar da var. Örneğin id değeri sadece sayı olacaksa (integer) kontrol etmeniz gerekir.
$id = $_GET['id'];
if(!is_int($id)){
//integer değilse bunu yap
}
else{
//integersa bunu yap
}Artık o istediğin tür neyse bunu kendine göre değiştireceksin. Vs. Vs.
Birşey daha. Google'a R10'a veya herhangi bir ilgili internet sitesinin arama bölümüne php güvenlik açıkları vs gibi bir sorgu gönderirsen inanki çok detaylı kaynaklar bulabilirsin. Yoksa kapris çekersin çok.
Aklına takılanı sorabilirsin.