Безопасность PHP - (int) против FILTER_VALIDATE_INT - PullRequest
17 голосов
/ 25 января 2011

Мне недавно сказали, что есть FILTER_VALIDATE_INT, что, кстати, замечательно.

Мой вопрос касается получения целочисленного значения с веб-сайта, может ли оно быть от пользователя или сгенерированного из веб-приложения, и передаваемого через строку запроса.

Значение (целое число) может отображаться или использоваться в запросе mysql.

Я пытаюсь создать для этого наилучший из возможных методов защиты.

Имея это в виду, безопасно ли просто использовать

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

Или

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

Также, пожалуйста, объясните, в чем разница между использованием (int) и FILTER_VALIDATE_INT

Ответы [ 2 ]

30 голосов
/ 25 января 2011

Разница в том, что приведение к int всегда даст вам int, которое может быть или не быть исходным значением. Например. (int)'foobar' приводит к int 0. Это делает его безопасным для большинства целей SQL, но не имеет ничего общего с исходным значением, и вы даже не узнаете его.

filter_var с FILTER_VALIDATE_INT сообщает , является ли значение int, на основании которого вы можете принять решение использовать его в запросе или отображении SQL сообщение об ошибке пользователю.

0 голосов
/ 22 октября 2015
 <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
}

Пожалуйста, попробуйте проверить, когда значение является числом.

...