Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

SqL injection ileilgili.

merhabalar arkadaslar. konuya her ne kadar hakim olsamda icimde hep bir tedirginlik vardır.
özeliklede
$sql = mysql_query("Select * from tablo where id='".$_GET["id"]."' ");
gibi bir sorgu ile tehlikede olduğumuzu biliyoruz. veya veri girişi yaparken bazı php fonksiyonları kullanıldıgınıda biliyoruz.

kendimce özel bir class hazırlamaktayim. bu class in ilk önceliği benim için güvenliktir. özellikle sorgular için söyle bir method kullanıyorum. bu kullanım sizce ne kadar dogru ve güvenilir olabilir ?

class mysql { ... 
...
...	
... 

	function q($sql,$arguman=NULL) 
	{	
		$arguman ? $sorgu = sprintf($sql,$arguman) : $sorgu=$sql;
		$this->query = mysql_query($sorgu) or die("Sorgu Hatası. <pre>".mysql_error()."</pre>");
		return $this->query;
	}

?>


bu veya buna benzer sql injection'dan korunmak için fikirlerinizi yazabilirmisiniz.
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • 1
    Kesali adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    208 cevap - 2 soru
    mysql_* fonksiyonları oldukça eskidir. Her ne kadar yazdığınız fonksiyon/class güvenlik sağlasada size tavsiyem PDO kullanın. Zaten php geliştiricileri php 5.4 ile mysql_* fonksiyonları Soft deprecated olarak belirledi. Yani ilerleyen sürümlerde tamamen kaldırılması gündemde. mysql_* fonksiyonları yerine PDO veya mysqli kullanmaya herkesin yavaş yavaş başlaması gerekmektedir.
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      cevabın için tsk ederim. ama maksat pdo yerine kendi classımızı kullanmak. ve kendimizce güvenlik acıkları tanıyıp nasıl kapatılacagı. bunla ilgili fikrilerinizi ögrenmek istiyorum..
      11 yıl önce yazılmış
    • xuma adlı üyenin fotoğrafı xuma
      :) Kesali'nin dediği gibi yakında mysql fonksiyonları kullanmıyacak.Bende uzun süredir PDO kullanıyorum onun eksikleri ve kullanımına odaklanıyorum.
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      hala hala ? ilginç arkadaşlar siz böyle diyince aklımda bir sürü soru işaretleri başladı. mysql_query gibi fonksiyonlar tarih olacak. yeni gelen sistemlerde calısmayacak diyorsunuz. onca yapılan calısma proje heba olacak yani? benim gibi bir sürü mysql_ kullananlar var. bu bir kaos gibi :S
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Tavsiye niteliğindeydi sadece. Sizin konunuza dönelim o zaman.

      Öncelikle verdiğiniz class taki obje herhangibir escape işlemi gerçekleştirmiyor. Zaten kendi mysql serverınızı hacklemek istemeyeceğiniz için query yolladığınız kısımda güvenlik açığı aramanıza gerek yok. Asıl sorun dışarıdan serverınıza gelen sorguları validate ve escape etmek. Yani eğer bir id integer değerini çağırmak için kilit nokta integer olup olmadığını kontrol etmek veya biraz daha fazla güvenlik istiyorsanız. Belirli bir aralığın içinde bir integer değeri olup olmadığını kontrol etmektir. Sizin örnek kodunuz escape etmez sadece sprintf ile belli oranda validate edebilirsiniz. Escape etmediği için string türündeki verilerde hala sql injection yeme şansınız vardır.
      11 yıl önce yazılmış 11 yıl önce güncellenmiş
    • xuma adlı üyenin fotoğrafı xuma
      Orjinal başlık http://www.phpclasses.org/blog/post/153-The-Plot-to-Kill-PHP-MySQL-Extension.html bu.Sadece tartışılmakta ve tartışılmaya başlanması bile oldukça önemli.Belki yakın gelecekte olmasa bile ilerleyen zamanlar içerisinde mysql eklentisi gidecek.Büyük ihtimalle birçok hosting firması kullanılacak sürümü seçmenizi sağlayacak opsiyonlar geliştirecek.Diğer türlü dediğin gibi kaos ortamı yaşanır.

      Mysql güvenliğini sağlamak için aslında hali hazırdaki birkaç fonksiyonunu kullanmak yeterli günümüzde artık XSS ve CSRF için daha fazla çalışma yapılabiliyor.Wordpress 3.3.0 versiyonunda bile XSS açıkları bulunması yaptığımız yazılımlarda bu tarz ufak hataların bulunup bulunmadığını düşündürüyor.

      Ben msyql eklentisini kullanmayalı çok uzun süre oldu ve gerçekten birkaç parametre ile güvenliği sağlamak oldukça kolay ve eğlenceli.
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      bildigim kadariyla java firması mysql u satın almıs. olayların gelısmesını buna baglayabılır mıyız
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      o zaman bizde simdiden kollarımızı sıvayalım pdo ile class yazalım
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Java (oracle yani) mysql i satın alması ile php içinde gelen php_mysql extensionı yeniden yazılarak mysqlnd olarak paketlendi. Yani php geliştiricileri 5.3 ile kendilerinin yazmış oldukları kütüphaneyi kullanır oldular, aralarında yasal veya yazılımsal hiçbir engel yok.

      Asıl olay şu php hızlı bir şekilde gelişiyor mysql_ fonksiyonları çok eskide kaldı. Maalesef insanları zorlamazsalar PDO classının kullanımı artmayacak. En azından tartışılması bile birçok yazılımcıyı PDO kullanımına teşvik etmiştir.

      PDO birçok avantaja sahiptir. Prepared statement çok etkili bir sql injection önleme yöntemidir mesela. PDO transaction aynı şekilde veri tabanında toplu işlem yapmamıza oluşabilecek bir hatada rollback ile veri geri dönebilmemizi sağlar.

      Şu ana kadar duyduğum tek eksi yanı çoklu queryi desteğinin olmamsı.
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      coklu query derken tam olarak neyi kast ettiniz. döngü icinde sorgumu ?

      $sql = mysql_query("Select * from tablo");
      while ($yaz = mysql_fetch_object($sql) {

      $sql2 = mysql_query("select * from tablo2 where tb2id='$yaz->id' ");
      ...
      }

      gibi bir kullanım mı
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      hımm bak bunları bılmem cok iyi oldu. eski mysql ile class yazıcaktık.. classı yeni pdo uyumuna göre yazmak daha iyi olacaktir. eski usul ile yapılan calısmaları yeniden kodlamak epey can sıkıntısı yaratacaktır.
      11 yıl önce yazılmış
    • xuma adlı üyenin fotoğrafı xuma
      Çoklu query bildiğim kadarıyla ;
      $sql="DELETE FROM kitaplar;create table saticilar satici(id INT);insert into kitaplar(id,isim) values('1','isim1');insert into kitaplar(id,isim) values('2','isim2');";
      $sorgu=mysql_query($sql);
      

      Şimdiye kadar hiç kullanmadım 5.3 ile pdo desteği geldiğini bir ara okudum sanırım ama problemli bir konu olduğu için hiç uğraşmadım.Yoksa yukarda verdiğin örnek ve benzeri uygulamalar pdo ile daha kolay.
      $sorgu = $db->("INSERT INTO kitaplar (adi,isbn, yazar_id) values (?, ?, ?)); 
      foreach ($a as $b){
      	$sorgu->execute(array($b->adi, $b->isbn, $b->id));
      }
      

      veya diyelimki;
      $sorgu = $db->("INSERT INTO kitaplar (adi,isbn, yazar_id) values (?, ?, ?),(?, ?, ?),(?, ?, ?));
      $sorgu->execute(array('lorem','ipsum','sit','lorem','ipsum','sit','lorem','ipsum','sit'));
      


      alanları kontrol etmekte kolay;
      $sorgu = $db->("INSERT INTO kitaplar (adi,isbn, yazar_id) values (:adi,:soyadi, :isi)); 
      $sorgu->bindParam(':adi',$kitapadi,PDO::PARAM_STR, 15);
      
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Php.net ten alınmış multi query örneği.
      $mysql = new mysql('localhost', 'user', 'pw', 'db'); 
      
      $query = 'show tables;'; 
      $query.= 'show tables;'; 
      $query.= 'select * from dummy_table;'; 
      $query.= 'show tables;'; // this statement will be ignored as the dummy_table doesn't exist and the loop should quit 
      
      $mysqli->multi_query($query); 
      


      Çok iyi yapmışsınız classınızı pdo ya çevirerek.
      11 yıl önce yazılmış
    • xuma adlı üyenin fotoğrafı xuma
      Active records kullanmama rağmen doctrine(http://www.doctrine-project.org/) hep ilgimi çekti.
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      pdo ya alısmak zaman alacak gibi... bos bır vakıte tum konularını ıncellemem lazım
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      saqolun arkadaslar. pdo ile ilk projemi yazdım.. bu arada coklu sql olayı ıcınde prepare olayı var. her birseyi tek tek ince detayına kadar düsünülmüs. fazlası var eksigi yok..
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Zaten birkaç güne öğreneceğinizi biliyordum. Zamanla mysql_ komutlarıyla neden vakit öldürmüşüm diyeceksiniz.
      Çoğu işlem oldukça basitleştirilmiş. İyi çalışmalar size.
      11 yıl önce yazılmış
    • siyahbeyaz adlı üyenin fotoğrafı siyahbeyaz
      saqol tsk ederim aynen ole dusundum. simdide diyorum daha onceki projeleri neden boyle yapmadım. iş güc yogunlugundan bu tur seyleri takip etmeye vaktimiz olmuyor. pdonun calisma sistemi aynı java gibi. ilginc olan su ki kod sırasına bakmıor.

      misal
      $db->bindParam(1,$title);
      $db->bindParam(2,$content);
      $db->execute();

      $title="Merhaba PDO";
      $content = "Hacılar PDO kendini aşmış gidiyor.. \n buda yeni birsey herhalde..";

      gibi bir kullanımda altaki titleyi alip ekliyor. beni en cok sasirtan özelliklerinden biride bu oldu
      11 yıl önce yazılmış

Cevaplar

Hiç cevap bulunamadı.