PHP Security - (int) vs FILTER_VALIDATE_INT

Недавно мне сказали, что есть FILTER_VALIDATE_INT, который, кстати, замечательный.

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

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

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

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

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

или

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

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

Ответ 1

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

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

Ответ 2

 <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
}

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