Подтвердить что ты не робот

Mysql_real_escape_string(), оставляющий слэши в MySQL

Я просто переехал в новую хостинговую компанию, и теперь всякий раз, когда строка сбегает, используя:

mysql_real_escape_string($str);

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

stripslashes()

больше.

Это на CentOS 4.5 64-разрядной версии php 5.2.6 как fastcgi на сервере lighttpd 1.4. Я гарантировал, что все параметры magic_quotes выключены, а клиент mysql api - 5.0.51a.

У меня такая же проблема для всех 6 моих веб-серверов.

Любая помощь будет оценена.

Спасибо.

Edit:

Волшебные кавычки не включены. Пожалуйста, не рекомендуем отключать его. ЭТО НЕ НОМЕР.

4b9b3361

Ответ 1

Хост, который вы переместили, возможно, включил magic_quotes_runtime. Вы можете отключить его с помощью set_magic_quotes_runtime(0).

Отключите magic_quotes_runtime, а затем измените свой код на использование переменных привязки, вместо того, чтобы использовать экранирование строки.

Ответ 2

Я могу думать о нескольких вещах, которые могут вызвать это. Но это зависит от того, как вы вызываете SQL-запросы. Если вы перешли на использование параметризованных запросов, например, с помощью PDO, то экранирование необязательно, что означает, что вызов mysql_real_escape_string добавляет дополнительные слэши.

Если вы используете mysql_query и т.д., тогда должен быть какой-то код где-то вроде addslashes, который это делает. Это может быть либо до того, как данные будут поступать в базу данных, либо после.

Также вы говорите, что вы отключили магические кавычки... если вы еще этого не сделали, просто выполните жесткую проверку кода с чем-то вроде этого:

echo htmlentities($_GET['value']); // or $_POST, whichever is appropriate

Убедитесь, что в этом значении нет косой черты, а затем проверьте это:

echo "Magic quotes is " . (get_magic_quotes_gpc() ? "ON" : "OFF");

Я знаю, что вы много раз говорили, что это не волшебные кавычки, но для нас, ребята, которые пытаются помочь нам убедиться, что вы проверили фактический вывод PHP, а не просто изменили конфигурацию (которая, возможно, не сработала).

Ответ 3

в базе данных сохраняются косые черты.

Это означает, что ваши данные удваиваются.

Есть две возможные причины:

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

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

Ответ 4

звучит так, будто у вас есть волшебные цитаты. Отключение этого не слишком сложно: просто создайте файл в корневом каталоге под названием .htaccess и поместите в него эту строку:

php_flag magic_quotes off

Если это невозможно по какой-либо причине или вы хотите изменить свое приложение, чтобы иметь возможность обрабатывать магические кавычки, используйте эту технику:

Вместо прямого доступа к переменным запроса используйте вместо этого функцию. Затем эта функция может проверить, включено или выключено магические кавычки, соответственно. Простое выполнение stripslashes() над всем не будет работать, потому что вы избавитесь от косой черты, которую вы действительно хотите.

function getVar($key) {
    if (get_magic_quotes_gpc()) {
        return stripslashes($_POST[$key]);
    } else {
        return $_POST[$key];
    }
}

$x = getVar('x');

Теперь, когда у вас это есть, все ваши входящие переменные готовы к повторному экрану, а mysql_real_escape_string() не будет их заполнять.

Ответ 5

Вероятно, вы должны включить магические кавычки. Выяснить, как именно отключить его, может быть довольно большая головная боль в PHP. Хотя вы можете отключить магические кавычки с помощью set_magic_quotes_runtime(0), этого недостаточно - магические кавычки уже изменили входные данные в этот момент, поэтому вы должны отменить изменение. Попробуйте этот фрагмент: http://talks.php.net/show/php-best-practices/26

Или еще лучше - отключите магические кавычки в php.ini и любые файлы .htaccess, в которые он может быть установлен.

Ответ 6

Я не уверен, правильно ли я понял проблему, но у меня была такая же проблема. Независимо от того, что я сделал, косые черты были там, когда струна сбежала. Поскольку мне нужно, чтобы вставленное значение находилось в том же формате, в котором он был введен, я использовал

htmlentities($inserted_value)

это приведет к тому, что все вставленные метки кавычек не будут защищены, но безвредны.

Ответ 7

Что может быть проблемой (это было с нами), что вы используете mysql_real_escape_string() несколько раз в одном и том же var. Когда вы будете использовать его несколько раз, он добавит косые черты.

Ответ 8

Функция ниже корректно удаляет косые черты before, вставляя в базу данных. Я знаю, что вы сказали, что магические кавычки не включены, но что-то добавляет косые черты, поэтому попробуйте следующую страницу и посмотрите результат. Это поможет выяснить, где. Вызовите с помощью page.php? Var = something-with'data_that; будет \es экранировано

Вы, скорее всего, увидите номер три, выводящий больше слэшей, чем нужно.

* Также измените данные db.

<?php

$db = mysql_connect('host', 'user', 'pass');

$var = $_REQUEST['var'];
echo "1: $var :1<br />";
echo "2: ".stripslashes($var)." :2<br />";
echo "3: ".mysql_real_escape_string($var)." :3<br />";
echo "4: ".quote_smart($var)." :4<br />";


function quote_smart($value)
{
    // Stripslashes is gpc on
    if (get_magic_quotes_gpc())
    {
        $value = stripslashes($value);
    }
    // Quote if not a number or a numeric string
    if ( !is_numeric($value) )
    {
        $value = mysql_real_escape_string($value);
    }
    return $value;
}

? >

Ответ 9

mysql_real_escape_string($str); должен делать именно это. он предназначен для добавления обратных косых черт к специальным символам, особенно если вы хотите передать запрос в mysql. Обратите внимание, что он также учитывает набор символов mysql.

Для более безопасной практики кодирования было бы полезно редактировать код и использовать stripslashes() для считывания данных и удаления косой черты.