PHP: является ли mysql реальной escape-строкой достаточной для очистки пользовательского ввода?
и mysql_real_escape_string
достаточно для очистки пользовательского ввода в большинстве ситуаций?
:: EDIT::
Я думаю в основном с точки зрения предотвращения инъекции SQL, но я в конечном итоге хочу знать, могу ли я доверять пользовательским данным после применения mysql_real_escape_string или если я должен принять дополнительные меры для очистки данных, прежде чем передавать их по приложению и базам данных.
Я вижу, где очистка для HTML-символов важна, но я бы не считал это необходимым для доверия пользовательский ввод.
T
10 ответов:
mysql_real_escape_string
не достаточно во всех ситуациях, но это, безусловно, очень хороший друг. Элемент лучше решение заключается в использовании Подготовленные Заявления//example from http://php.net/manual/en/pdo.prepared-statements.php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // insert one row $name = 'one'; $value = 1; $stmt->execute();
кроме того, не забывайте HTMLPurifier который может быть использован для удаления любых недопустимых / подозрительных символов.
...........
Edit: Основываясь на комментариях ниже, мне нужно опубликовать эту ссылку (я должен был сделать это раньше извините за создание путаницы)
mysql_real_escape_string () против подготовленных операторов
цитирую:
использования mysql_real_escape_string (), склонных к такого же рода вопросы, влияющие функция addslashes().
Крис Шифлетт (Эксперт По Безопасности)
ответа на ваш вопрос нет. mysql_real_escape_string() не подходит для всех пользовательских входных данных и mysql_real_escape_string () не останавливает все SQL-инъекции. addslashes () - это еще одна популярная функция для использования в php, и она имеет ту же проблему.
уязвимый код:
mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));
Лок использовать:
http://localhost/sql_test.php?id=1 or sleep(500)
патч должен использовать кавычки вокруг id:
mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");
действительно лучший подход заключается в использовании параметризованных запросов, которые количество людей, на которых указал ахве. Pdo работает хорошо, adodb-это еще одна популярная библиотека для php.
Если вы используете mysql_real_escape_string, это должно использоваться только для инъекции sql и ничего больше. Уязвимости сильно зависят от того, как используются данные. Меры безопасности следует применять по функциональному принципу. И да, XSS-это ОЧЕНЬ СЕРЬЕЗНАЯ ПРОБЛЕМА. Не фильтрация для html-это серьезная ошибка, которую хакер будет использовать для pw3n. Ознакомьтесь, пожалуйста XSS на часто задаваемые вопросы.
в базу данных, да. Вы также захотите рассмотреть возможность адекватного экранирования / кодирования данных для вывода.
вы также должны рассмотреть проверка вход против того, что вы ожидаете.
вы рассматривали использование подготовленные заявления? PHP предлагает множество способов взаимодействия с вашей базой данных. Большинство из которых лучше, чем mysql_* функции.
PDO,базы данных mdb2 и MySQL Улучшено вы должны начать.
каких ситуациях?
для SQL-запросов, это здорово. (Подготовленные заявления лучше-я голосую PDO для этого - но функция бежит просто отлично.) Для HTML и тому подобное, это не инструмент для работы - попробуйте универсальный
htmlspecialchars
или более точный инструмент, как в HTML-очиститель.чтобы обратиться к edit: единственный другой слой, который вы можете добавить, - это valdation данных, например, подтвердите, что если вы помещаете целое число в базу данных, и вы ожидаете положительное целое число, вы возвращаете ошибку пользователю при попытке ввести отрицательное целое число. Что касается целостности данных,
mysql_real_escape_string
Это лучшее, что у вас есть для побега (хотя, опять же, подготовленные операторы-это более чистая система, которая полностью избегает побега).
mysql_real_escape_string()
полезно только для предотвращения атак SQL-инъекций. Это не поможет вам предотвратить атаки межсайтовых сценариев. Для этого, вы должны использоватьhtmlspecialchars()
непосредственно перед выводом данных, которые были первоначально собраны из пользовательского ввода.
есть два способа, один из которых-использовать подготовленные операторы (как упоминалось в других ответах), но это замедлит ваше приложение, потому что теперь вам нужно отправить два запроса в базу данных вместо одного. Если вы можете жить с уменьшенной производительностью, то идите на это; подготовленные операторы делают ваш код красивее и проще в обращении.
Если вы решили использовать mysql_real_escape_string, то убедитесь, что вы экранируете все строки, которым не доверяют. An (mysql_real_escape_string) экранированная строка-это SQL Injection secure. Если вы не избегаете всех строк, то вы не в безопасности. Вы должны действительно объединить mysql_real_escape_string с проверкой ввода; проверка того, что переменная, которую вы ожидаете содержать число, действительно является числом и в пределах ожидаемого диапазона. Помните, никогда не доверяйте пользователю.
существуют различные типы "чистки".
использования mysql_real_escape_string достаточно для данных базы данных, но все равно будет оцениваться браузером при отображении, если это HTML.
удалить HTML из пользовательского ввода, вы можете использовать strip_tags.
Я бы предложил вам изучить использование PDO вместо обычного материала MySQL, поскольку он поддерживает подготовленные операторы прямо из коробки, и те обрабатывают экранирование неверные данные для вас.
вы можете попробовать оба, а в
function clean_input($instr) { // Note that PHP performs addslashes() on GET/POST data. // Avoid double escaping by checking the setting before doing this. if(get_magic_quotes_gpc()) { $str = stripslashes($instr); } return mysql_real_escape_string(strip_tags(trim($instr))); }
лучший способ пойти было бы использовать Подготовленные Заявления
Я думал, что добавлю, что PHP 5.2+ имеет функции фильтра ввода, которые могут дезинфицировать пользовательский ввод различными способами.
здесь ручной ввод а также блоге [Мэтт Мясник] о том, почему они великолепны.