ctype_digit () sayı kontrolü php güvenlik.
Get metodu ile numerik yani tamamen sayılardan oluşan bir ´id´ alıyorsunuz ve o ´id´ye ait bir veriyi veritabanından aşağıdaki kod ile çekiyorsunuz.
...ÇOK BÜYÜK BİR HATA...
...PHP-MYSQL GÜVENLİK İHLALİ...
...SQL Injection kurbanı olabilirsiniz...
Bunun için yapılması gereken $_GET[aracno] değerini süzerek tamamen gelmesi gereken şekilde bir veri olup olmadığını anladıktan sonra sql sorgusunu gerçekleştirmesini sağlmalıyız.
Önerilen seçeneklerden biri olan ctype_digit () ile gelen bir verinin içindekilerin tamamen sayısal olup olmadığını kontrol edebilirsiniz.
if (ctype_digit ($deger)) {
echo"Değer tamamen rakamlardan oluşursa bu uyarı çıksın.";
} else {
echo"Değerin içinde numaraların dışında harfler ve özel karakterlerde var.";
}
Çıktısı şu şekilde olacaktır :
Fakat $deger="15" yada $deger=15; olduğu takdirde çıktı şu şekilde olacaktır:
Eğer üsttede söylediğim şekilde bir sayfanız var ise tehlikedesiniz demektir.
Ben bu problemimi şu şekilde çözdüm ;
Sayfanın başında şu kontrolü yaptırıyorum :
if (!ctype_digit($deger)) { header("Location:http://nursininsitesi.com"); }
mysql_query("SELECT * FROM cars WHERE id = ´$deger´ LIMIT 1 ");
Şu şekilde çalışıyor. Gelen verinin içindekilerin tamamı sayılardan oluşmuyorsa sayfayı hemen ana sayfaya yönlendiriyorum. Dolayısıyla sorgu çalışmamış oluyor ve saldırı sonucunda sitenizin veri bilgilerine ulaşamamış oluyorlar.
Dikkatle Teşekkürler:::...
Güvenlik için başka yönetem bilenler varsa kesinlikle paylaşmalılar. Diğer üyelerimizdende rica etsek bilgileri olduğunca güvenlik hakkında da dökümanlar çok iyi olur.
numara
şöyle de olabilir.
{
echo "hooop hemşerim , kayıt numarası gelmedi !";
exit;
}
Güvenliği sağlamak lazım ama Herkesin saldırgan olacağını düşünmeyin. linkleri yanlış kodladıysan normal üyeler de ne olduğunu bile anlamadan ana sayfaya yönlendirilir.
sütten dili yanan yoğurdu üfleyerek yermiş...
type casting yapilip direk int e donustururseniz zaten uygun degilse sifira donusmus olur
$numara = (int) $_GET["numara"];
soru
ooo hocam siz cok ileride gidiyorsunuz hiç bişey anlamdım daha dizilerdeyim
Ben genelde
mysql_query("SELECT * FROM cars WHERE id=´".$id."´ LIMIT 1");
şeklinde kullanıyorum ve bunu injekte etmeye de çalıştım ama hiç problem olmadı şimdiye kadar ?
Acep server side ayarlardan mı kaynaklanıyor injekte edemiyor olmam ?
evt
evet. birçok sunucuda koruma vardır.
Nursin in dediği gibi, bizimki yoğurdu üfleyerek yemek.
Php
Yararlı bilgi için teşekkür ederim sayın Nursin Şaşmaz.
Php ye ilk başladığım zamanlarda bolca sql injection denemelerine maruz kalmış biri olarak bu tür kontrollerin değerini bilmek ve mutlaka kullanmak lazım diye düşünüyorum.
Ben önceleri yaptığım scriptlerde sadece mysql_real_escape_string kullanıyordım, bunu da öğrendiğim iyi oldu.
Teşekkür etmek için üye oldum ama sitenizi sık kullanılanlarıma ekledim bile.
Hörmetler...