(Int) и is_int () безопасны для защиты от SQL-инъекций? - PullRequest
6 голосов
/ 30 июня 2010

Итак, мне было интересно, достаточно ли этого, чтобы пользователь не делал никаких SQL-инъекций, а число будет только целым и всегда целым?Функция $ id в функции getArticle связана с запросом SQL.

<?php $id = (isset($_GET['id']) && is_int((int)$_GET['id'])) ? (int)$_GET['id'] : false ?>
<?php $news = $class->getArticle($id) ?>

Насколько я тестировал, все работало нормально, но я не совсем уверен, что лучше спросить вас, парень!Хорошо, люди говорят, что готовые заявления помогут.Они действительно будут?Например, могу ли я быть полностью уверен, что если связать параметр как целое число, то это будет целое число, ничего больше?

Заранее спасибо!

Ответы [ 4 ]

10 голосов
/ 30 июня 2010

Вы можете просто набрать приведение к нужному типу:

$number = intval($_GET['id']);
$string = mysql_real_escape_string(strval($_GET['str']));

Чтобы убедиться, что вы получите то, что ожидаете.

Лучшее решение - использовать Подготовленные операторы чтобы избежать инъекций sql.

5 голосов
/ 30 июня 2010

Используйте готовые заявления.Нет причин НЕ использовать их.Тогда вам не нужно спрашивать «Это достаточно хорошо?»

0 голосов
/ 30 июня 2010

просто используйте:

$id=(int)@$_GET['id'];

, если $ _GET ['id'] не установлено, $ id будет 0.если вы хотите проверить, правильно ли установлен идентификатор, используйте:

if ($id=(int)@$_GET['id']){
  //
} else {
  //invalid id
}
0 голосов
/ 30 июня 2010

Я не могу придумать, как это можно использовать для SQL-инъекций.Так что я бы сказал, что это достаточно безопасно.

...