Является ли этот запрос инъекционным доказательством? - PullRequest
1 голос
/ 12 августа 2010

Я использую PDO для связи с моей базой данных, и мне интересно, достаточно ли приведения типа, подобного этому

$dbh->query("SELECT * FROM recipes WHERE id=".(int)$id);

, чтобы предотвратить инъекцию sql?В этом случае $ id всегда является целым числом.

Мне также интересно, что было бы хорошим способом предотвратить внедрение в этот тип оператора, если бы переменная была строкой.

Ответы [ 6 ]

4 голосов
/ 12 августа 2010

Да. Приведение к int предотвращает все неприятные возможности внедрения SQL.

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

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
3 голосов
/ 12 августа 2010

Поскольку вы уже используете PDO, лучшим подходом будет использование:

Это намного лучше:

$dbh->prepare("SELECT * FROM recipes WHERE id = ?");
$dbh->bindParam(1, (int) $id);
// more code.....
0 голосов
/ 21 марта 2011

Осторожно, однако, в PHP (int) преобразует NULL в 0.

Поэтому, если у вас была значительная связь с идентификатором 0 в вашем приложении, это могло бы непреднамеренно вызвать это значение.

0 голосов
/ 19 августа 2010

Да, связывание с целым числом достаточно, чтобы предотвратить SQL-инъекцию, если параметр ожидается как целое число.

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

0 голосов
/ 12 августа 2010

Поскольку вы специально приводите $id к целому числу, это безопасно.Для строки (или любого другого типа данных) вам необходимо экранировать ее перед выполнением запроса;взгляните на PDO::quote.

0 голосов
/ 12 августа 2010

Вы должны экранировать имена таблиц и полей в запросе:

$dbh->query("SELECT * FROM `recipes` WHERE `id=`'".(int)$id."'");
...