#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, но там просто опечатка.