@rinaz22

Надежно ли использовать только is_numeric и is_int?

Всем привет! Перед тем как делать запрос, проверяю id с помощью такого условия:
if (!is_numeric($_GET['id']) or !is_int($_GET['id']+0))
	exit ("Ошибка!");

Если все хорошо, то делаю запрос:
SELECT * FROM `users` WHERE `id` = '$_GET[id]'
Надежна ли такая проверка или все же могу "подцепить" SQL инъекцию?
  • Вопрос задан
  • 215 просмотров
Пригласить эксперта
Ответы на вопрос 4
bigton
@bigton
Web-программист
1. Забудьте про $_GET/$_POST/$_SERVER/$_COOKIE, в PHP уже давно есть filter_input
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

Смотрите мануал https://www.php.net/manual/ru/function.filter-inpu... смотрите фильтры, опции, примеры.

2. От SQL инъекций защищает https://www.php.net/manual/ru/mysqli.real-escape-s... непосредственно перед запросом.
Ответ написан
Konata69lol
@Konata69lol
backend developer (php/go)
Не в том месте от инъекций защищаетесь.
Лучше это делать непосредственно перед запросом (prepared statements к примеру).
Ответ написан
php666
@php666
PHP-макака
Посмотри мою обертку под MySql. Там это уже всё сделано.

if (!is_numeric($_GET['id']) or !is_int($_GET['id']+0))
Насчет подобных проверок... поверь, я "собаку съел" на этом, писав свою библиотеку и я скажу, что на самом деле мало кто из отвечающих сразу так напишет правильный ответ =) Все существующие в PHP механизмы определения чисел, все эти фильтры и расширения для оных - крайне плохо работают.

Если вкратце, то вот метод определения целого числа. Вот метод определения с точкой. В последнем есть небольшая бага, но в целом это работает:

foreach ([
             '9223372036854775808', 9223372036854775808, // > PHP_INT_MAX + 1
             1, '10', '+1', '1.1', 1.1, .2, 2., '.2', '2.',
             '-2.', '-.2', null, [], true, false, 'string'
         ] as $value) {
    echo $value . ':' . gettype($value) . ' is Integer? - '  . (isInteger($value) ? 'yes' : 'no') . PHP_EOL;
    echo $value . ':' . gettype($value) . ' is Float? - '  . (isFloat($value) ? 'yes' : 'no') . PHP_EOL;
}


9223372036854775808:string is Integer? - yes
9223372036854775808:string is Float? - no
9.2233720368548E+18:double is Integer? - no
9.2233720368548E+18:double is Float? - yes
1:integer is Integer? - yes
1:integer is Float? - no
10:string is Integer? - yes
10:string is Float? - no
+1:string is Integer? - yes
+1:string is Float? - no
1.1:string is Integer? - no
1.1:string is Float? - yes
1.1:double is Integer? - no
1.1:double is Float? - yes
0.2:double is Integer? - no
0.2:double is Float? - yes
2:double is Integer? - no
2:double is Float? - yes
.2:string is Integer? - no
.2:string is Float? - yes
2.:string is Integer? - no
2.:string is Float? - yes
-2.:string is Integer? - no
-2.:string is Float? - yes
-.2:string is Integer? - no
-.2:string is Float? - no   <---- тут только ошибка, не починил еще
:NULL is Integer? - no
:NULL is Float? - no
Array:array is Integer? - no
Array:array is Float? - no
1:boolean is Integer? - no
1:boolean is Float? - no
:boolean is Integer? - no
:boolean is Float? - no
string:string is Integer? - no
string:string is Float? - no
Ответ написан
@Kerm
Я пишу в своем коде вот так:

if ((int)$_GET['id'] > 0) {
.....
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы