2011-01-25 14 views
13

Niedawno powiedziano mi, że jest FILTER_VALIDATE_INT, który jest świetny przy okazji.PHP Security - (int) vs FILTER_VALIDATE_INT

Moje pytanie dotyczy liczby całkowitej pobranej ze strony internetowej, czy to od użytkownika, czy wygenerowanej z aplikacji internetowej i przekazanej za pośrednictwem ciągu zapytania.

Wartość (liczba całkowita) może być wyświetlana lub używana w zapytaniu mysql.

Próbuję strukturyzować najlepszą możliwą metodę zabezpieczenia dla tego.

Mając to na uwadze, jest to bezpieczne, aby po prostu użyć

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

Albo

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

Należy również wyjaśnić, jaka jest różnica między używaniem (int) i FILTER_VALIDATE_INT

+0

Aby rozwinąć istniejące odpowiedzi, "FILTER_SANITIZE_NUMBER_INT" jest równoważne rzutowaniu "(int)". – mario

+3

@mario, jak możesz to powiedzieć? Nie jest. –

Odpowiedz

27

Różnica polega że obsada int zawsze da ci int, która może ale nie musi być oryginalna wartość. Na przykład. (int)'foobar' wyniki w int0. Dzięki temu jest bezpieczny dla większości celów SQL, ale nie ma nic wspólnego z oryginalną wartością, a ty nawet o tym nie wiesz.

filter_var z FILTER_VALIDATE_INTmówi ty czy wartość jest int, na podstawie których można podjąć decyzję, aby wykorzystać je w zapytaniu SQL lub wyświetlenie komunikatu o błędzie do użytkownika.

+0

@deceze chciałbyś wiedzieć, czy istnieje duża różnica między 'filter_var' i jego' is_int' odpowiednik? –

+2

@Russell Dias: wyniki dla '' 42'' co najmniej (liczba całkowita reprezentowana jako ciąg). – zerkms

+0

@zerkms Oops nie zdawał sobie sprawy, że testuje również łańcuch liczbowy. Dziękuję za przykład;) –

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 
} 

Spróbuj przetestować, gdy wartość jest liczbą.