Предотвращение инъекций PHP SQL со строковыми операциями

Возможный дубликат:
Лучший способ предотвратить 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?

Нет.

Учебный материал

  • Шифрование MySQL SQL Injection
  • Шифрование предупреждений SQL Injection
  • Как избежать уязвимостей, связанных с внедрением SQL-инъекций
  • больше защитных чит-листов

Контроль безопасности кодирования

Не пишите свои собственные средства контроля безопасности! Переосмысление колеса, когда дело доходит до разработки средств контроля безопасности для каждого веб-приложения или веб-службы, приводит к растрачиванию времени и массивным дырам в безопасности. Инструментарий OWASP Enterprise Security API (ESAPI) помогает разработчикам программного обеспечения защищать связанные с безопасностью дефекты проектирования и реализации – https://code.google.com/p/owasp-esapi-php/

Просто используйте PDO и подготовьте свои заявления.