27 Aralık 2016 Salı

Php _GET & _POST & Url & Int & Değişken & SQL Güvenliği

Php'de kodlama yaparken $_GET gibi değişkenlerden gelen zararlı karakterleri filtrelemek için bu yöntemleri öneririm:


A) $_GET & $_POST & Url & Int & DEĞİŞKEN GÜVENLİĞİ

1. İlk olarak gelen değişkendeki html karekterlerini zararsız hale getirelim (< yerine < gibi)
$user_name= htmlspecialchars($_GET['user_name']);
    Veya
$name= filter_input(INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS);

       Ben htmlspecialchars kullanıyorum. Farkı yok. Fakat filter_input en az PHP 5.2.0 gerektirir.  Eğer html kodlarından tamamen kurtulmak isterseniz  $user_name=strip_tags($user_name)

2. Eğer aldığınız değer integer (sayısal) ise gerçekten sayısal mı diye kontrol edelim
$user_id =intval($_GET['user_id']);
Veya
$user_id = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT);
     Ben intval kullanıyorum. Farkı yok. Fakat filter_input en az PHP 5.2.0 gerektirir.
   
     Eğer sayısal bir değer gelmezse NULL değeri döner. 'sddd3' gibi bir değer için 3 döner. Eğer gelen sayısal değeri - ve + işaretlerinden arındırmak istiyorsanız:  $user_id = abs($user_id); 

3. Eğer aldığınız değer url içeriyorsa güvenlik için şu şekilde kullanalım (Bu sefer POST yöntemi için örnek verelim)
$url = urlencode($_POST['url']);
Veya
$url = filter_input(INPUT_POST, 'url', FILTER_SANITIZE_ENCODED);
    Ben urlencode kullanıyorum. Farkı yok. Fakat filter_input en az PHP 5.2.0 gerektirir. Eğer encode edilmiş url'yi decode etmek isterseniz:  $url=urldecode($url);


B) SQL GÜVENLİĞİ

1. Eğer SQL sorgu cümlesi içerisine ' gibi özel karakterler girip sorun çıkarmasını istemiyorsanız sorgunuzu çalıştırmadan önce sql cümlenizi filtrelemeniz gereklidir.
// PDO
$safe = $db->escape_string($name); // OOP Style

// MySQLi
$safe = mysqli_real_escape_string($db, $name); // mysqli

// mysql_*
$safe = mysql_real_escape_string($name, $db);

// Genel Kullanım (Son Çare Olarak Kullanılabilir)
$safe = addslashes($name);