[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проверка intval
12345
Правильно ли я проверяю $_GET['id'] на целое число? возможно ли будет тут как-то запустить sql инъекцию???
if(isset($_GET['id']) and intval($_GET['id'])!=="")
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}
else
{
echo "Ошибка";
}




Спустя 2 минуты, 2 секунды (13.07.2012 - 09:23) vagrand написал(а):

if(isset($_GET['id']))
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".intval($_GET['id'])."'");
$bar = mysql_fetch_array($bar_sql);
}

Спустя 1 минута, 58 секунд (13.07.2012 - 09:25) 12345 написал(а):
На а так как я, что, не правильно разве?

Спустя 1 час, 27 минут, 23 секунды (13.07.2012 - 10:53) Placido написал(а):
Цитата (12345 @ 13.07.2012 - 09:25)
На а так как я, что, не правильно разве?

Не правильно. Во-первых, если придет строка, то условие выполнится (так как intval() в возвращает целое число или 0, а это в любом случае !== ''), а во-вторых, в таком варианте, если в $_GET['id'] ничего не придет, то условие не выполнится (сработает isset()), и вылетит нотис "undefined index".

Спустя 7 минут, 22 секунды (13.07.2012 - 11:00) 12345 написал(а):
ну а вот так? :)


if(isset($_GET['id']))
{
if(intval($_GET['id'])>="0")
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}
}

else
{
echo "Ошибка";
}


:D

Спустя 17 минут, 12 секунд (13.07.2012 - 11:17) TMake написал(а):
Цитата (12345 @ 13.07.2012 - 12:00)
ну а вот так? smile.gif

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

Спустя 33 минуты, 23 секунды (13.07.2012 - 11:51) Guest написал(а):
Нужно не проверять на условие, а просто фильтровать приходящие данные.
Проверка условия это алгоритмы, фильтры это безопасность.

Спустя 20 минут, 54 секунды (13.07.2012 - 12:12) AlmazDelDiablo написал(а):
Как-то так.
Если $_GET['id'] существует, приводим ее к числу, иначе создаем переменную с ошибкой. И далее проверяем, не является ли $id нулем и нет ли $error`ов.

isset( $_GET['id'] ) ? $id = (int)$_GET['id'] : $error = 1;

if( !$error AND $id > 0 )
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='{$id}'");
$bar = mysql_fetch_array($bar_sql);
}
else
{
echo "Ошибка";
}

Спустя 1 час, 13 минут, 14 секунд (13.07.2012 - 13:25) I++ написал(а):
<?

if(isset($_GET['id']))
{
// * - в SELECT плохой тон, выборку данных нужно делать, только по нужным данным.
$bar_sql = mysql_query('SELECT * FROM `bar` WHERE `id` = '.(int)$_GET['id']); // Кавычки кавычкам рознь, " и ' разные вещи.
// $bar_sql а может тут false? Ниже код будет кидать ошибку.

if($bar_sql !== false) // Это будет быстрее чем if($bar_sql)
$bar = mysql_fetch_array($bar_sql); // Заменить на mysql_ fetch_ assoc или mysql_fetch_ row ибо быстрее.
else
echo 'Нет результатов';
}
else
{
echo 'Ошибка'; // Кавычки кавычкам рознь
}

?>


intval проигрывает в производительности (int)

Спустя 1 час, 55 минут, 25 секунд (13.07.2012 - 15:20) kamanch написал(а):
I++
Цитата
if(isset($_GET['id']))


Если в гет придет строка, то условие все равно сработает, и пойдет ненужная нам уже обработка данных.

if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0){
.......................
} else {
echo "не число";
}


или
if(isset($_GET['id']) and intval($_GET['id']) >0)


Спустя 25 минут, 9 секунд (13.07.2012 - 15:45) Placido написал(а):
Цитата (h.n.81 @ 13.07.2012 - 15:20)
if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0)...
или
if(isset($_GET['id']) and intval($_GET['id']) >0)

... и если в $_GET['id'] ничего не пришло, получаем нотис "undefined index".

Спустя 29 минут, 31 секунда (13.07.2012 - 16:15) kamanch написал(а):
Попробовал оба варианта при
 error_reporting(E_ALL); 


Нотисов не пришло.

Спустя 2 часа, 28 минут, 25 секунд (13.07.2012 - 18:43) 12345 написал(а):
А не легче сделать так? :)
if(filter_var($_GET['id'], FILTER_VALIDATE_INT)))
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}


Если $_GET['id'] = 0, то скрипт не выполняется. Хороший фильтр :D

Так будет безопасно? <_<

Спустя 9 минут, 44 секунды (13.07.2012 - 18:53) Placido написал(а):
Цитата (h.n.81 @ 13.07.2012 - 16:15)
Попробовал оба варианта при
 error_reporting(E_ALL); 

Нотисов не пришло.

Да, действительно. После невыполнения первого условия все, что стоит после AND, проверяться не будет. Не знал.

Называется это Short-circuit evaluation. После некоторых поисков информации на эту тему, оказалось, что внятного описания данного "поведения" в официальной документации PHP нет. Об этом же говорят и на stackoverflow.

Спустя 4 часа, 19 минут, 18 секунд (13.07.2012 - 23:12) I++ написал(а):
Свернутый текст
Цитата (h.n.81 @ 13.07.2012 - 16:20)
I++
Цитата
if(isset($_GET['id']))


Если в гет придет строка, то условие все равно сработает, и пойдет ненужная нам уже обработка данных.

if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0){
.......................
} else {
echo "не число";
}


или
if(isset($_GET['id']) and intval($_GET['id']) >0)

И часто строки приходят из формы по гету если там предполагалось число? или по гет запросу тыча на ссылке?

Лишняя обработка, проверять строго входящие данные, в условии этого не стояло.

В данном примере если будет строка, то (int)$_GET['id'] вернет 0, что обычно является дефолтным значением.

Ну потычет какой нибудь чувак этот гет с id, да и успокоится.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.