• 06-08-2013, 18:35:36
    #1
    Merhaba,
    oyun sunucum için bir cms yapıyorum,
    kayıt olma kısmında
    $username = $_POST['username'];
    $password = $_POST['password'];
    $rpassword = $_POST['rpassword'];
    $email = $_POST['email'];
    $captcha = $_POST['captcha'];
    Bunun gibi kodlarım var gerekli kontürolleri yaparken ve yaptıktan sonra sql sorgusunu çalıştırırken nasıl sql injectiondan korunabilirim? Birkac yerde PDO'yu falan okudum ancak nasıl kullanacağımı tam olarak anlayamadım.
  • 06-08-2013, 19:28:07
    #2
    Üyeliği durduruldu
    veritabanına kayıt ederken mysql_escape_string fonksiyonundan geçir.
    post'ları da strip_tags fonksiyonundan geçirebilirsin.
  • 06-08-2013, 19:41:47
    #3
    quaick adlı üyeden alıntı: mesajı görüntüle
    Merhaba,
    oyun sunucum için bir cms yapıyorum,
    kayıt olma kısmında
    $username = $_POST['username'];
    $password = $_POST['password'];
    $rpassword = $_POST['rpassword'];
    $email = $_POST['email'];
    $captcha = $_POST['captcha'];
    Bunun gibi kodlarım var gerekli kontürolleri yaparken ve yaptıktan sonra sql sorgusunu çalıştırırken nasıl sql injectiondan korunabilirim? Birkac yerde PDO'yu falan okudum ancak nasıl kullanacağımı tam olarak anlayamadım.
    ben şu şekilde kullanıyorum. Eminim başka daha güvenli yöntemler de vardır.

    $username = mysql_real_escape_string(strip_tags(trim($_POST["username"])));
    diğerleri de aynı şekilde.
  • 06-08-2013, 20:57:05
    #4
    	# filtre
    	function filter($txt, $seviye=1) {
    
    		// magic_quotes_gpc çalışıyorsa eklenen slashları kaldıralım
    		$txt = get_magic_quotes_gpc() ? stripslashes($txt) : $txt;
    
    		// mysql_escape_string'i işleyelim
    		$txt = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($txt) : mysql_escape_string($txt);
    
    		// hangi html taglerine izin vereceğiz?
    		$allow='<br><br /><i><u><sup><sub><h1><h2><h3><h4><h5><h6><div><p><img><a><table><center><font><span>';
    		
    		if ($seviye == 3)
    			$txt = strip_tags($txt, $allow);
    		else
    			$txt = strip_tags($txt);
    		
    		$txt = htmlspecialchars($txt);
    		
    		$txt = trim($txt);
    		
    		if ($seviye == 2)
    			$txt=stripslashes($txt);
    			
    	return $txt;
    	}
    	
    	foreach($_GET as $var => $val) {
    		if (!is_array($_GET[$var])) $_GET[$var] = filter($val);
    	}
    	
    	foreach($_REQUEST as $var => $val) {
    		if (!is_array($_REQUEST[$var])) $_REQUEST[$var] = filter($val);
    	}
    	
    	foreach($_POST as $var => $val) {
    		if (!is_array($_POST[$var])) $_POST[$var] = filter($val);
    	}
    Sayfanızın en üstüne yerleştirin.
  • 13-08-2013, 19:13:01
    #6
    Cas
    Üyeliği durduruldu
    quaick adlı üyeden alıntı: mesajı görüntüle
    Merhaba,
    oyun sunucum için bir cms yapıyorum,
    kayıt olma kısmında
    $username = $_POST['username'];
    $password = $_POST['password'];
    $rpassword = $_POST['rpassword'];
    $email = $_POST['email'];
    $captcha = $_POST['captcha'];
    Bunun gibi kodlarım var gerekli kontürolleri yaparken ve yaptıktan sonra sql sorgusunu çalıştırırken nasıl sql injectiondan korunabilirim? Birkac yerde PDO'yu falan okudum ancak nasıl kullanacağımı tam olarak anlayamadım.
    Yıllardır beri bu 2 yöntem işi görüyor.
    http://yazilimcity.org/forum/php/86-...onksiyonu.html

    http://yazilimcity.org/forum/php/107...venligi-3.html
  • 13-08-2013, 19:18:17
    #7
    Üyeliği durduruldu
    En garanti çözüm pdo, kullanımı da çok zor değil,

    $db = mysql_connect()...; yerine $db = new \PDO(dsn, user, password);

    mysql_query().. yerine de $stmt = $db->prepare(SQL); $db->execute(parametreler); $results = $db->fetchAll(); olacak. SQL i hazırlarken de "SELECT * FROM tablo WHERE id = '" . $_POST['id'] . "'" yerine "SELECT * FROM tablo WHERE id = ?" olacak, execute kısmında parametre verilecek, isteyen olursa detaylı bir örnek yapabilirim
  • 14-08-2013, 00:32:02
    #8
    Hyperion adlı üyeden alıntı: mesajı görüntüle
    En garanti çözüm pdo, kullanımı da çok zor değil,

    $db = mysql_connect()...; yerine $db = new \PDO(dsn, user, password);

    mysql_query().. yerine de $stmt = $db->prepare(SQL); $db->execute(parametreler); $results = $db->fetchAll(); olacak. SQL i hazırlarken de "SELECT * FROM tablo WHERE id = '" . $_POST['id'] . "'" yerine "SELECT * FROM tablo WHERE id = ?" olacak, execute kısmında parametre verilecek, isteyen olursa detaylı bir örnek yapabilirim
    mysql_real_escape_string,strip_tags bazende addslashes fonksiyonları can kurtarır mysql pdo biraz zor gibi geliyor başlangıçta yada benim için zordu.

    ek olarak sql injection olayına karşı sorgularla veya post,get verilerini sınırlayarak daha güçlü bir koruma sağlayabilirsiniz.

    SELECT * FROM yerine SELECT id,sifre FROM ---- LIMIT 1

    Post veya Get den gelen verinin strlen ile limitlenmesi yada sadece numara yada harf ile sınırlandırmak vb bir çok önlem alabilirsiniz.
  • 14-08-2013, 02:05:55
    #9
    Üyeliği durduruldu
    mysql_escape_string inject için çıkmıştır tek başına yeterlidir. // Anlamı mysqli etkileyen tagları çıkart / sil

    Tabi daha gelişmiş bi fonksiyon yazabilirsin örneğin benim kendi fonksiyonum.

    function guvenlik($q) { 
    $q = htmlspecialchars(stripslashes($q));
    $q = str_replace("script", "blocked", $q);
    $q = str_replace("select", "", $q);
    $q = str_replace("SELECT", "", $q);
    $q = str_replace("UPDATE", "", $q);
    $q = str_replace("update", "", $q);
    $q = str_replace("delete", "", $q);
    $q = str_replace("DELETE", "", $q);
    $q = str_replace("UNION", "", $q);
    $q = str_replace("union", "", $q);
    $q = str_replace('"', "", $q);
    $q = str_replace("%", "", $q);
    $q = mysql_escape_string($q);
    $q = str_replace("`","",$q);
    $q = str_replace("'","'",$q);
    $q = str_replace("-","-",$q);
    $q = str_replace("&","",$q);
    $q = str_replace("%","",$q);
    $q = str_replace("<","",$q);
    $q = str_replace(">","",$q);
    $q = trim($q);
    return $q; 
    }