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
}
Пожалуйста, попробуйте проверить, когда значение является числом.