2009-10-22 20 views
11

Tüm POST ve GET değişkenlerini tek bir işlevle etkin bir şekilde kolayca temizlemenin bir yolunu bulmaya çalışıyorum. İşte fonksiyon kendisidir:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

Ve burada çağırır kod: çalışması lazım gibi Bana göre

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

bu görünüyor. Ama bir sebepten ötürü bir formda sahip olduğum bazı onay kutularından dizileri döndürmeyecek. Boş çıkıyorlar.

Yukarıdaki işlevleri kullanmadan kodumu test ettim ve iyi çalışıyor, sadece oraya eklenmiş biraz güvenlik istiyorum.

Teşekkürler!

+1

Her içerik için her şeyi temizlemeye çalışmaktan kaçınmalısınız. Bu, yalnızca uygulamanızı engeller ve kayıp işlevselliği yeniden oluşturmak istediğinizde güvenliği zorlaştırır. Bu, magic_quotes'un devre dışı bırakılmasının geçerli bir nedeni. http://php.net/manual/en/security.magicquotes.php Burada bir anlamda yeniden yarattığınız bir şey. Girdiğin uygulama için girdinin dezenfekte edilmesi gerekiyor. Tarayıcıya HTTP üzerinden gönderiyorsanız, bunu HTTP ve HTML için dezenfekte edin. SQL DB'ye gönderiyorsanız, bunu SQL için dezenfekte edin. – bucabay

+0

Üzgünüm, kullanımdan kaldırıldım: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

Yardım/öneri için teşekkürler! Süreci yeniden gözden geçirmem gerekiyor gibi görünüyor. :-) – tscully

cevap

22

Mümkünse filter_input'u kullanın (php5 +) Bunu çok daha temiz tutar ve kullandığınız her şeyi sterilize edip doğrulayabileceğinizi bildiğim kadarıyla.

Sen bütün sonrası dizi filtre filter var array ve örneğin FILTER_SANITIZE_STRING bayrağını kullanabilirsiniz

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

filter reference

+0

oh bu harika!Bunu daha önce hiç görmedim :) – Mickey

+1

Bu, en iyi yöntem php5 – robjmills

1

kontrolsüz onay kutularını sunucuya gönderilmez W3Schools'da geçerli farklı filtre seçenekleri yükler vardır .

Eğer

6

örneğin array_map gibi bir şey kullanabilirsiniz tekrarlama daha şık hale getirmek için:

$_POST = array_map('mysql_real_escape_string',$_POST); 

Kullanım filtresi var eğer yapabilirsiniz olsa yaklaşımlar bu tür olsa da, sadece bir örnektir genellikle kötü olarak;)

1

Bu, girişi temizlemenin yanlış yolu.

$_POST ve $_GET'da kesinlikle her şeye kaçan battaniye mysql uygulamasının uygulanması, bir veritabanı sorgusu yaptıktan sonra verileri kullanmak istiyorsanız ancak yine de sizden kaçış karakterleri istemiyorsanız Orada.

Mysqli veya PDO ile parametreli sorgular kullanın ve mysql_real_escape_string()'u kullanmanız gerekmeyecektir.

+0

ise, zaten başlatılmış olan veritabanına bağlantınız yoksa daha da kötüsü. – alex

+0

İşlev çağrısının hemen yukarısındaki bağlantıyı kurdum, ancak sizler orada neyin var olduğunu görmenize gerek yok. ;-) – tscully

+0

bakın: http://php.net/manual/en/security.magicquotes.php – bucabay