• 02-02-2014, 18:33:56
    #10
    her sorguda aynı fonksiyonları kullanmak yerine özel bir fonksiyon yazıp kullanmanızı öneririm.
    benim örnek kullandığım bir fonkisiyon aşağıda ki gibidir.
    aşağıdaki fonksiyonu kullanırken dikkat edilmesi gereken konu ise
    "$baglan" değişkenidir.bu değişken ise mysql_connect fonksiyonunu atadığınız değişken olmalıdır.

    $baglan = mysql_connect($host,$kullaniciadi,$sifre);
    mysql_select_db($veritabani,$baglan);
    function antisql($data) 
    {
    	$html = "";
    	global $baglan;
    	if (function_exists("mysql_real_escape_string")) {
    		$data = @mysql_real_escape_string($data, $baglan);
    		$data = strip_tags($data,$html);
    	} else {
    		$data = mysql_escape_string($data);
    		$data = strip_tags($data,$html);
    	}
    	return $data;
    }
  • 02-02-2014, 18:45:21
    #11
    Üyeliği durduruldu
    Merhaba ,

    php ile kodlanan scriptlerde sql injection yemek ve bu işlem yapıldığında işe yaramasının tek bir sebebi var.

    Bu da ücretsiz ve açık kaynak scriptleri kullanmak ve yazılan çok basit kodlama ile yapılan scriptler.

    biraz özgün düşünmek ve hazır script yerine işi gerçekten bilen kişilere script kodlatmak bu tür korkuların önüne geçeceğini düşünüyorum.

    mesela ben bir script kodluyorum ve bu script için db oluşturuyorum kim nereden bilecek üyeler için kullandığım tablonun adını nerede bulunduğunu.

    sonra çok ama çok basit bir filtre ile "<>" gibi işaretlerden veya diğer tüm işimize yaramayan karakterlerden kurtulmak basit.

    Örnek Function :

    Function Temizlik($Deger){
    
    	return stripslashes($Deger);
    
    }
  • 02-02-2014, 19:11:24
    #12
    Kimlik doğrulama veya yönetimden onay bekliyor.
    ezSQL şu escape metodunu kullanıyor bilmem işine yarar mı?

    function escape($string)
    {
    	return mysql_real_escape_string(stripslashes($string));
    }
  • 02-02-2014, 19:14:45
    #13
    Misafir
    PDO bildiğim kadarıyla tüm bu süzme işlemlerini kendisi yapıyor. Pdo makalelerinde güvenli, esnek vb şeklinde anlatılıyor.

    Tabi bunları deneyip, harbiden güvenlik sağlıyor mu sağlamıyor mu denemek test etmek lazım. Tek başına bilgi uçar gider, test edilirse bilgi pekişmiş olur.
    • chedmade
    chedmade bunu beğendi.
    1 kişi bunu beğendi.
  • 02-02-2014, 19:21:53
    #14
    PDO da prepare ve execute fonksiyonlarını yeni keşfettim. sanırım @PsdBul; hocamın dediği kırmızı noktadan sonrasının kontrol sağlamadan dahi güvenliğini maximuma çıkararak sql injection temizliyor.
    • saintx
    saintx bunu beğendi.
    1 kişi bunu beğendi.
  • 02-02-2014, 19:23:00
    #15
    Misafir adlı üyeden alıntı: mesajı görüntüle
    PDO da prepare ve execute fonksiyonlarını yeni keşfettim. sanırım @PsdBul; hocamın dediği kırmızı noktadan sonrasının kontrol sağlamadan dahi güvenliğini maximuma çıkararak sql injection temizliyor.
    evet. kendi içerisinde süzüp yolluyor.
  • 02-02-2014, 19:47:52
    #16
    PDO'da parameter binding özelliğiyle ilgili bi' örnek;

    @bknz; Bu soruda detaylı bi' anlatım yapılmış gözüküyor.

    <?php
    	
    	$db_host = "localhost";
    	$db_port = 3306;
    	$db_user = "root";
    	$db_pass = "root";
    	$db_name = "m2it";
    	$db_charset = "utf8";
    	
    	try
    	{
    		$PDO = new PDO("mysql:host={$db_host};port={$db_port};dbname={$db_name};charset={$db_charset}", $db_user, $db_pass);
    		
    		# PDOStatement
    		$stmt = $PDO->prepare("SELECT * FROM `logs` WHERE `channel` = :channel");
    		
    		$stmt->execute(array("channel" => "test"));
    		
    		$results = $stmt->fetchAll(PDO::FETCH_OBJ);
    		
    		print_r($results);
    	}
    	catch(PDOException $e)
    	{
    		echo $e->getMessage();
    	}
    çıktı;

    Array
    (
        [0] => stdClass Object
            (
                [ID] => 1
                [channel] => test
                [level] => 
                [message] => 
                [context] => 
                [extra] => 
                [formatted] => 
                [time] => 
            )
    
        [1] => stdClass Object
            (
                [ID] => 2
                [channel] => test
                [level] => 
                [message] => 
                [context] => 
                [extra] => 
                [formatted] => 
                [time] => 
            )
    )
  • 02-02-2014, 20:04:06
    #17
    beyler htaccess yazarken bile filtreleme yapmayan (.*) veren bir milletiz.
    Oysa oradan gelen değer sef url ise ([a-zA-Z0-9-]{1-100}) sayı ise ([0-9]+) verirsen sql injection arkada o dosyaya bile ulaşmaz. ama bir çok acemi ya da tembel arkadaşımızın (.*) diye genel kuralı verip her çeşit stringi input olarak yönlendirdiğini görüyorum.

    Veri filtrelemeden önce veri kontrolü yapmak lazım.
    Önce kontrol edeceksin gelen veri beklediğin türde mi.
    Gelen veri sayı mı, yazı mı, içinde html etiket var mı, içinde tek tırnak çift tırnak kullanma izni var mı, stringin maksimum uzunluğu ne olabilir?
    Bunları kontrol edeceksin, eğer beklediğin gibi input gelmezse direk reddedeceksin.
    İnput beklediğin gibi ise yine de filtreleyeceksin.

    Ayrıca sadece get ve post değil. http referrer, cookie gibi kullanıcı taraflı manipüle edilebilecek tüm dataları önce kontrol etmek sonra filtrelemek lazım.
  • 02-02-2014, 23:43:32
    #18
    PDO ile MySQL'i arasında çok çok büyük ve kayda değer bir fark yoktur. İkisi de kullanılabilir. Ama PDO ileriye dönük olabilir. Sonuçta 12 veritabanını destekliyor.