Путаница с mysql_real_escape_string и strip_slashes - PullRequest
5 голосов
/ 15 февраля 2012

У меня есть пользователи, которые вводят свое имя, например: O'riley.

Перед тем, как ввести эти данные в БД MySQL, я запускаю mysql_real_escape_string.

Проблема в том,затем выберите эти данные для отображения и использования позже, они получаются как: O\'riley.

Очевидно, что это предполагаемая операция.Что меня интересует, так это то, что есть возможность быть уверенным, что я смогу сохранить его в БД (все еще безопасно избегая возможного вредоносного кода), чтобы мне не приходилось использовать strip_slashes() в выходных данных КАЖДЫЙ раз, когда я вызываю данные повсюдувсе веб-приложение?Или я что-то здесь упускаю?

Спасибо.

ОБНОВЛЕНИЕ Пожалуйста, обратитесь к комментариям в ответ Дечезе.

Ответы [ 9 ]

10 голосов
/ 15 февраля 2012

Нет, эта операция не предназначена для сохранения строки как "O \ 'riley"; он должен быть экранирован только в запросе, но не храниться таким образом. Я предполагаю, что PHP вставляет обратную косую черту через Магические кавычки , и вы избегаете его снова, чтобы заставить его придерживаться.

Отключить магические кавычки .

4 голосов
/ 05 июня 2012

Хорошо, вот что вам нужно сделать.Во-первых, исходя из комментариев, из других вопросов:

ИЗОЛЯЦИЯ

Вам необходимо определить причину проблемы.Это сервер?Это какой-то скрытый код где-то?Какие?Некоторые программисты могут включать такой код на странице конфигурации:

<?php if (isset($_POST)) 
    foreach ($_POST as $key => $value) $_POST[$key] = addslashes($value); 
?>

Итак, вот несколько проверок, чтобы увидеть, является ли это сервер.Это примерно надежный способ проверки, насколько это возможно.Создайте NEW страницу.Оставьте это поле пустым и добавьте следующий код:

<?php print_r($_POST); ?>
<form action="" method="POST">
<input type="text" name="test" value="O'riley" />
<input type="submit" name="submit" value="submit" />
</form>

Сохраните его и загрузите в браузер.Хит отправить.Посмотрите, добавлена ​​ли еще косая черта.

Если она все еще добавляет ее, вам необходимо устранить неполадки на сервере / конфигурации.Если вы платите за сервер, вы должны сказать им, чтобы это исправить или засунуть.Если это ваш собственный сервер, то вам нужно будет поработать, чтобы выяснить, как отключить магические кавычки.

Если не отображаются кавычки, то определенно есть некоторый код, добавляющийкосые черты в вашем посте переменных.Однако это может быть не так очевидно, как в приведенном выше коде.Вам нужно запустить поиск в вашем коде для "addlashes", "mysql_real_escape_string" и, возможно, "str_replace".Если вы найдете один из них, вам нужно отключить его.Но имейте в виду, что это может сломать другие части вашего сайта, которые предполагают, что это действие имеет место.Другой способ сохранить его в базе данных - выполнить функцию, аналогичную приведенной выше, но вместо этого запустить на ней полоску.Затем вы можете запустить mysql_real_escape_string позже.(Немного больше ненужных накладных расходов.)

4 голосов
/ 04 июня 2012

Если у вас отключены магические кавычки и в случае, когда get_magic_quotes_gpc вернул 1, и вы сделали что-то вроде @ Michael , и это все еще происходит, может быть включена среда выполнения магических кавычек.

Среда выполнения магических кавычек добавит косые черты в строки при выполнении запросов к базе данных и даже при записи в файлы. Чтобы отключить это в выполняемом в данный момент скрипте, выполните:

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
{
    set_magic_quotes_runtime(false);
}

Вы также можете отключить эту опцию конфигурации через php.ini, если можете это сделать. Однако, если вы не можете отключить его с помощью php.ini навсегда, вам может потребоваться добавить @ перед get_magic_quotes_runtime и set_magic_quotes_runtime, поскольку PHP может с ошибками E_DEPRECATED, если error_reporting установлен для регистрации таких ошибок (и это приведет к довольно раздражает).

4 голосов
/ 03 июня 2012

Я лично всегда отключаю магические кавычки, потому что это делает то, что я не велел делать.Если у вас нет возможности его отключить, рассмотрите возможность включения этого кода вверху всех ваших страниц.

if (get_magic_quotes_gpc()) {
    function strip_array($var) {
        return is_array($var)? array_map("strip_array", $var):stripslashes($var);
    }

    $_POST = strip_array($_POST);
    $_SESSION = strip_array($_SESSION);
    $_GET = strip_array($_GET);
}
3 голосов
/ 30 мая 2012

Используйте

var_dump(get_magic_quotes_gpc());

где-то рядом с фактическим использованием опубликованных данных, чтобы увидеть, действительно ли отключены Волшебные цитаты.

Также некоторые странные рамки могут добавлять упомянутые цитаты для вас, так чтоВаш код для addslashes и других escape_string -подобных функций.

2 голосов
/ 04 июня 2012

Я бы честно предложил использовать PDO.

В PDO используется оператор подготовки и выполнения, что, в свою очередь, повышает безопасность и устраняет некоторые дополнительные проблемы.

$pdo = new PDO();
$stm = $pdo->prepare('INSERT... (LastName) VALUES (:LastName)');
$stm->execute(array(':LastName' => "O'Rily"));

$stm->fetchAssoc(PDO::FETCH_ASSOC);

Вы неДольше придется беспокоиться об удалении убегающих слешей, а также об обеспечении базовой тактики внедрения SQL.

0 голосов
/ 07 июня 2012

Спасибо всем за ответы.Я награжу +50, но я хотел рассказать свое реальное решение здесь, все, с чем люди помогли ...

Я выполнял mysql_real_escape_string для всех данных КАК СКОРО, как они были опубликованы (перед любой обработкой).Итак, косая черта была добавлена ​​для экранирования введенного символа '.Это, как мы знаем, нормально.

Однако не было никаких причин, по которым обратная косая черта \ должна отображаться в записи БД, верно?Выход был там, чтобы убедиться, что введено '.

Оказывается, ПОСЛЕ экранирования, я бы затем сохранил переменную для повторной загрузки на страницу в сеансе, в случае, если у пользователя возникла ошибка,PHP обнаружен при проверке всех полей формы.В этом случае ввод пользователя (ранее O'riley теперь выводился на его экран как O\'riley. Затем пользователь не улавливал это - поэтому он часто просто исправлял свою ошибку, которую обнаружил PHP во время проверки (не связанный споле имени), и, таким образом, O\'riley попадет в базу данных, потому что mysql_real_escape_string будет экранировать символы.

Урок : при обработке формы ПЕРВЫЙ сохраняйте данные для заполнения формыиспользуйте. ВТОРОЙ проверяйте поля формы. ТРЕТЬЕ экранируют данные для обработки в базу данных.

Или, еще лучше, используйте PDO и избегайте этого =).

Комментарии приветствуются.СПАСИБО ВСЕМ!

0 голосов
/ 05 июня 2012

Просто используйте очистить данные перед вставкой в ​​базу данных,

function check_input($value)
{
    if( get_magic_quotes_gpc() )
    {
        $value = stripslashes( $value );
    }

    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
        $value = mysql_real_escape_string( $value );
    }

    //for PHP version < 4.3.0 use addslashes
    else
    {
        $value = addslashes( $value );
    }

    return $value;
}


$cleandata = check_input($value);

$sql = "INSERT INTO `table_name` SET `field_name`='".$cleandata."'";

При извлечении данных и отображении в них используйте stripslashes($val)

0 голосов
/ 05 июня 2012

Возможно, магические кавычки включены в вашем httpd.conf или в объявлении виртуального хоста.

Точное местоположение и файл будут зависеть от ОС и дистрибутива.Я бы проверил конфигурационные файлы Apache для настройки php_flag.

...