Возможный дубликат:
Лучший способ предотвратить SQL-инъекцию в PHP?
Я занимаюсь исследованиями SQL Injection, но у меня есть некоторые вопросы, на которые я не мог найти ответ. Невозможно ли предотвратить атаки SQL-инъекций на уровни строк? Я имею в виду, мы не можем это предотвратить;
Поиск незаконных символов перед их обработкой через запросы mysql?
$postID = $_POST['id']; if($postID contains characters) remove characters; if($postID still contains characters) then exit; else mysql_real_escape_string($postID); //just in case? continue to do whatever you are doing...
Действительно ли необходимо использовать PDO / mysqli? Достаточно ли проанализировать ваши строки sql для обработки в mysql? Пожалуйста, имейте в виду, что я не являюсь экспертом PHP или MySQL во время ответа. Я тот, кто пытается узнать о них.
Конечно, вы можете защитить от инъекции mysql_real_escape_string($postID)
, если вы не возражаете против запроса каждый раз, когда вы вызываете функцию.
PDO и MySQLi обеспечивают гораздо больше, чем просто защиту от инъекций. Они позволяют подготовить подготовленные операторы, которые могут защищать инъекцию agaisnt без множественных вызовов в db. Это означает более высокую общую производительность. Представьте, что вы пытаетесь вставить в таблицу запись пользователя с 30 столбцами … это много mysql_real_escape_string()
.
Подготовленные операторы отправляют сразу все данные вместе с запросом и удаляют его на сервере по одному запросу. Поддержка Mysql DB подготовила записи, старые библиотеки php mysql_ не поддерживают их.
Время для перехода к mysqli или предпочтительно PDO – вы никогда не оглядитесь назад.
Я бы посоветовал вам использовать PDO (объекты данных PHP). Это поможет избежать SQL-инъекций и ускорит выполнение запросов. Кроме того, ваше приложение становится более абстрактным из базы данных.
Что-то вроде следующего:
$stmt = $conn->prepare("INSERT INTO table_name VALUES(:id, :firstname, :lastname)"); $stmt->bindValue(':id', $id); $stmt->bindValue(':firstname', $firstname); $stmt->bindValue(':lastname', $lastname); $stmt->execute();
Если ваш идентификатор является целым числом, просто используйте
$postID = (int)$_POST['id'];
И, конечно, подтвердите, если $ postID это! = Нуль после этой строки.
Я бы не рекомендовал вам использовать функции mysql_ больше, потому что они устарели. Проверьте: http://php.net/manual/en/function.mysql-real-escape-string.php для получения дополнительной информации о том, почему обычный mysql_ был прекращен. Вы можете легко переключиться на mysqli. Это действительно не так сложно. Плюс, если вы хотите избежать символов, и вы не хотите заменять каждый mysql_real_escape_string для нового способа экранирования, вы можете использовать эту функцию:
function mysql_string_safe($stringtoclean) { //In this case, $safestring = mysqli_real_escape_string('your_handle_here',$stringtoclean); return $safestring; }
Итак, вы замените mysql_real_escape_string для mysql_string_safe. Mysqli действительно похож на mysql_, но он более безопасен. Я переключился на него, и это не заняло слишком много времени, это было легко, потому что это просто заменило материал. Соединение с базой данных тоже отличается. С другой стороны, PDO поддерживает различные драйверы базы данных, но если вы хотите сэкономить время, и вы не собираетесь переключаться с драйверами баз данных, просто используйте mysqli.
Действительно ли необходимо использовать PDO / mysqli?
Нет.
Достаточно ли проанализировать ваши строки sql для обработки в mysql?
Нет.
Не пишите свои собственные средства контроля безопасности! Переосмысление колеса, когда дело доходит до разработки средств контроля безопасности для каждого веб-приложения или веб-службы, приводит к растрачиванию времени и массивным дырам в безопасности. Инструментарий OWASP Enterprise Security API (ESAPI) помогает разработчикам программного обеспечения защищать связанные с безопасностью дефекты проектирования и реализации – https://code.google.com/p/owasp-esapi-php/
Просто используйте PDO и подготовьте свои заявления.