2011-01-25 23 views
13

Geçtiğimiz günlerde FILTER_VALIDATE_INT adresinin harika olduğunu söyledik.PHP Güvenlik - (int) vs FILTER_VALIDATE_INT

Sorum şu olabilir: Web sitesinden tamsayılı bir değer alıp almadığımı kullanıcıdan mı yoksa web uygulamasından mı kaynaklandığını ve sorgu dizesiyle iletildiğini.

Değer (tam sayı) mysql sorgusunda görüntülenebilir veya kullanılabilir.

Bunun için mümkün olan en iyi güvenlik yöntemini oluşturmaya çalışıyorum. Bunu göz önünde bulundurarak

, güvenli basitçe

$myNum = (int)$_GET['num']; 

Ya da

if (filter_var($_GET['num'], FILTER_VALIDATE_INT)) $myNum = $_GET['num']; 

, farktır (int) ve FILTER_VALIDATE_INT

+0

Mevcut yanıtları genişletmek için, 'FILTER_SANITIZE_NUMBER_INT'' (int) 'casting öğesine eşdeğerdir. – mario

+3

@mario, bunu nasıl söylersin? O değil. –

cevap

27

kullanma arasındaki fark nedir açıklayınız kullanmaktır int için bir döküm her zaman size orijinal olabilir ya da olmayabilir bir int alacaktır değer. Örneğin. (int)'foobar', int0 ile sonuçlanır. Bu, çoğu SQL için güvenli hale getirir, ancak orijinal değerle ilgisi yoktur ve bunu bile bilmezsiniz. FILTER_VALIDATE_INTile

filter_var değeri kullanıcıya bir hata mesajı bir SQL sorgusunda kullanmak veya gösterilecek karar verebilirsin ki dayanan bir int olup olmadığını sen söyler.

+0

@deceze 'filter_var' ile' is_int' karşılığı arasında bir fark olup olmadığını biliyor musunuz? –

+2

@Russell Dias: '42' için sonuçlar en azından (tamsayı dizi olarak temsil edilir). – zerkms

+0

@zerkms Oops, sayısal bir dizgiyi de test ettiğini fark etmedi. Örnek için teşekkürler;) –

0
<input type="text" name="param"></input> 


$price = filter_input(INPUT_POST, 'param', FILTER_VALIDATE_INT); 
if ($price !== false) { 
print " a number."; //works when value is number 
} 


if(is_int($_POST['param'])){ 
    print "is number."; //don't works when value is number 
} 

Lütfen değer sayı olduğunda test yapmayı deneyin.