Мне просто интересно было ли, что я мог бы использовать некоторые формы подготовленных операторов в MySQL, поэтому мне не пришлось бы скрывать все мои входы, и мне не пришлось бы переключать все мои файлы с MySQL на MySQLi. Я действительно не доверяю функциям экранирования, поэтому, если есть какие-то альтернативы, которые работают в обычном MySQL, было бы здорово.
Используйте PDO (объекты данных PHP) для подключения к базе данных MySQL. Этот метод гарантирует, что все входные данные базы данных будут всегда обрабатываться как текстовые строки, и вам никогда не придется выполнять ручное экранирование.
Это в сочетании с надлежащим использованием html_entities () для отображения данных из вашей базы данных является прочным и хорошим способом защиты вашей страницы от инъекций. Я всегда использую PDO для обработки всех моих подключений к базе данных в своих проектах.
Создайте объект базы данных (и в этом случае применяйте определенную кодировку символов):
try { $db = new PDO("mysql:host=[hostname];dbname=[database]",'[username]','[password]'); $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8"); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $db->exec('SET NAMES utf8'); } catch (PDOException $e) { echo $e->getMessage(); }
Затем используйте его так:
$id = 1; $q = $db->prepare('SELECT * FROM Table WHERE id = ?'); $q->execute(array($id)); $row = $q->fetch(); echo $row['Column_1'];
или
$q = $db->prepare('UPDATE Table SET Column_1 = ?, Column_2 = ? WHERE id = ?'); $q->execute(array('Value for Column_1','Value for Column_2',$id));
и с подстановочными знаками:
$search = 'John'; $q = $db->prepare('SELECT * FROM Table WHERE Column_1 LIKE ?'); $q->execute(array('%'.$search.'%')); $num = $q->rowCount(); if ($num > 0) { while ($row = $q->fetch()) { echo $row['Column_1']; } } else { echo "No hits!"; }
Прочитайте больше:
Как я могу предотвратить SQL-инъекцию в PHP?
Когда * не * использовать подготовленные заявления?
насколько безопасны подготовленные заявления PDO
Если вы не хотите иметь дело с тем, чтобы ускользнуть от своего ввода, вы всегда можете сопоставить его так, как он есть, а затем отправить ваши предварительно написанные заявления. Это действительно будет стоить усилий, если у вас есть относительно немного возможных операторов для выполнения.