ctype_digit () sayı kontrolü php güvenlik.

nssasmazNursin ŞaşmazAvatar

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.

mysql_query("SELECT * FROM cars WHERE id = ´$_GET[aracno]´ LIMIT 1 ");

...Ç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.

$deger="nursin23";
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 :

Değerin içinde numaraların dışında harfler ve özel karakterlerde var.

Fakat $deger="15" yada $deger=15; olduğu takdirde çıktı şu şekilde olacaktır:

Değer tamamen rakamlardan oluşursa bu uyarı çıksın.


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 :

$deger=mysql_real_escape_string($_GET[´aracno´]);
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:::...smiley

Gitme vakti gelince gitmek mi zordur kalmak mı?
2010-02-05 03:17:15

nssasmazNursin ŞaşmazAvatar

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.

Gitme vakti gelince gitmek mi zordur kalmak mı?
2010-02-05 04:04:16

numara

şöyle de olabilir.

if(!is_numeric($_GET["numara"]))
{
    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.
Her programcı birgün Php yi tadacaktır
2010-02-05 08:33:37

nssasmazNursin ŞaşmazAvatar

sütten dili yanan yoğurdu üfleyerek yermiş... smiley

Gitme vakti gelince gitmek mi zordur kalmak mı?
2010-02-05 10:42:24

sdemirkeserSuleyman Demirkeser

type casting yapilip direk int e donustururseniz zaten uygun degilse sifira donusmus olur

$numara = (int) $_GET["numara"];

2010-02-05 11:35:53

soru

ooo hocam siz cok ileride gidiyorsunuz hiç bişey anlamdım daha dizilerdeyim smiley

2010-02-05 15:05:07

KunthMesut Cemil ASLANAvatar

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 ?

Kunth, just kunth...
2010-02-07 03:13:04

evt

evet. birçok sunucuda koruma vardır.

Nursin in dediği gibi, bizimki yoğurdu üfleyerek yemek.

Her programcı birgün Php yi tadacaktır
2010-02-07 09:36:50

Php

nacarNejdet Acar

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...

2010-11-04 02:57:16 Edit:2010-11-04 02:59:45

phpkodlari.com © 2009 Herkes Php öğrenecek
Eglence ve Oyun: Gamikro