Является ли это доказательством инжекции запроса?

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

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

достаточно для предотвращения внедрения sql? В этом случае $ id всегда является целым числом.

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

Да. Кастинг для 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(); 

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

  • Подготовленные заявления

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

 $dbh->prepare("SELECT * FROM recipes WHERE id = ?"); $dbh->bindParam(1, (int) $id); // more code..... 

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

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

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

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

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

Осторожно, хотя в PHP (int) будет конвертировать NULL в 0.

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