Я использую 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 в приложении, это может непреднамеренно вызвать это значение.