PHP: является ли mysql реальной escape-строкой достаточной для очистки пользовательского ввода?


и mysql_real_escape_string достаточно для очистки пользовательского ввода в большинстве ситуаций?

:: EDIT::

Я думаю в основном с точки зрения предотвращения инъекции SQL, но я в конечном итоге хочу знать, могу ли я доверять пользовательским данным после применения mysql_real_escape_string или если я должен принять дополнительные меры для очистки данных, прежде чем передавать их по приложению и базам данных.

Я вижу, где очистка для HTML-символов важна, но я бы не считал это необходимым для доверия пользовательский ввод.

T

10 57

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+ имеет функции фильтра ввода, которые могут дезинфицировать пользовательский ввод различными способами.

здесь ручной ввод а также блоге [Мэтт Мясник] о том, почему они великолепны.