Я использую следующий код для удаления нежелательных символов, но он не удаляет все и выдает ошибку MySQL:
$commentmessage = strip_tags($commentmessage);
$commentmessage = htmlentities($commentmessage, ENT_QUOTES);
Какой код я бы использовал, чтобы удалить все, что может вызвать ошибку MySQL?
Я получаю сообщение:
Сообщение об ошибке: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с ‘omg thats one’. Один из логотипов, который нам действительно понравился, был 1049859, где f ‘в строке 2 **
Очевидно, вы строите свой запрос так:
$query = "INSERT INTO foo VALUES ('$bar')";
который ломает, потому что текст $bar
содержит одинарные кавычки. '
Нет. * бьет тебя свернутой газетой * Плохой разработчик
я мог просто скинуть вам функцию экранирования строки, или я мог бы показать вам, как это сделать правильно, например:
$bar = "I am a problematic string!'; DROP TABLE USERS -- "$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
$stmt->execute(array($bar));
Или же:
$bar = "I am a problematic string!'; DROP TABLE USERS -- "$query = "INSERT INTO foo VALUES (:bar)";
$stmt = $dbh->prepare($query);
$stmt->execute(array('bar'=>$bar));
Когда вы готовите такой запрос, как PHP / PDO / MySQL, соберитесь и заранее договоритесь о типах заполнителей. Таким образом, ваши строки обрабатываются как строки без необходимости экранирования символов. Это предотвращает нарушение вашего запроса мошенническими одинарными кавычками и помогает защитить вас от атак с использованием SQL-инъекций.
Вы также можете повторно использовать подготовленные операторы для повышения производительности: [относительно неподготовленных операторов, так как SQL нужно анализировать только один раз, а не один раз для запроса]
$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
foreach( $bars as $bar ) {
$stmt->execute(array($bar));
}
Других решений пока нет …