intval или is_numeric? PHP

#php #isnumeric

Вопрос:

я извлекаю текст из базы данных mysql и получаю его по идентификатору в URL:

site.php?id=1 и так далее

Что считается наиболее безопасным для предотвращения sql-инъекций и прочего. Правильно ли это:

 <?php
$news_id = $_GET['news_id'];

if(!is_numeric($news_id)) die('Wrong');

//mysql_query and stuff here
?>
 

ИЛИ вот так:

 <?php
$news_id = $_GET['news_id'];

if(!intval($news_id)) die('Wrong');

//mysql_query and stuff here
?>
 

Комментарии:

1. Небольшое примечание к is_numeric, оно допускает шестнадцатеричный символ (не такая уж большая проблема с точки зрения безопасности). Если вам действительно нравится проверять числовое значение, используйте ctype_digit, обязательно введите строку, а не int: ctype_digit ( (int) 123 ); // false ctype_digit ( ‘123’ ); // true

Ответ №1:

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

Но используйте intval, чтобы превратить строку в целое число, а затем просто поместите это в подготовленный оператор, и вы будете защищены, так как значение int может быть нулевым или отрицательным, поэтому из вашего запроса ничего не будет возвращено.

Ответ №2:

 $news_id = (int)@$_GET['news_id'];
if ($news_id <= 0) die ('Wrong');
 

Предположение news_id положительное (>0).

Ответ №3:

Если вы используете intval, вы не сможете использовать news_id=0, потому что intval всегда будет возвращать 0, если news_id не является числом. is_numeric более подходит и безопасен в вашем случае.

Комментарии:

1. Скорее всего, news_id это сгенерированный столбец, который никогда не будет содержать 0. Если это так, то нет никакого вреда в использовании intval( $id ) в запросе; если запрос содержал неверный идентификатор, вы в конечном итоге отобразите ошибку «не найден», что вполне приемлемо для неверного запроса. В качестве альтернативы, конечно, если 0-это значение, которое никогда не используется, вы можете проверить вывод и выдать другую ошибку («пожалуйста, укажите действительный идентификатор»), отклоняющую запрос.

Ответ №4:

 if (preg_match("/^[1-9] d*$/", $news_id)){
    // you're good to go
}
 

Комментарии:

1. Это исключает ведущие 0 s, включая «0». Это намеренно? Кроме того, это не полезно.

Ответ №5:

is_numeric-не лучший способ проверить это,

 $number = "4"; // string ? int ?
 

intval не возвращает значение true или false. поэтому вы не можете использовать его так, как вы написали.
попробуйте вот это

 if(intval($news_id) === (int)$news_id){
//code goes here
}
 

или

 if(intval($news_id) == $news_id){
//code goes here
}
 

Комментарии:

1. Каков допустимый диапазон номеров для вашего удостоверения личности? Начинается ли это с нуля или единицы?

2. этот ответ совершенно неверен, такой функции, как int_val, не существует

3. @Traveling_Monk Остынь, я имел в виду intval, но там просто опечатка.