mysql_real_escape_string () оставляя косые черты в MySQL - PullRequest
12 голосов
/ 06 октября 2008

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

mysql_real_escape_string($str);

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

stripslashes()

больше.

Это на CentOS 4.5 64bit работает php 5.2.6 как fastcgi на сервере lighttpd 1.4. Я удостоверился, что все опции magic_quotes отключены, а API-интерфейс клиента mysql - 5.0.51a.

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

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

Спасибо.

Edit:

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

Ответы [ 9 ]

16 голосов
/ 06 октября 2008

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

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

4 голосов
/ 19 декабря 2009

Я могу подумать о нескольких вещах, которые могут вызвать это. Но это зависит от того, как вы вызываете 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, а не просто изменили конфигурацию (которая может не сработать) .

2 голосов
/ 11 января 2013

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

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

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

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

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

2 голосов
/ 06 октября 2008

звучит так, как будто у вас включены магические кавычки. Отключить его не так уж и сложно: просто создайте файл в корневом каталоге с именем .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() не будет их заполнять.

0 голосов
/ 11 января 2013

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

0 голосов
/ 12 сентября 2012

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

htmlentities($inserted_value)

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

0 голосов
/ 01 мая 2009

Функция ниже корректно удалит косые черты перед вставкой в базу данных. Я знаю, вы сказали, что магические кавычки не включены, но что-то добавляет косую черту, поэтому попробуйте следующую страницу и посмотрите результат. Это поможет понять где. Вызовите с page.php? Var = что-то с data_that; will`be | escape

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

* Также измените подробности БД.

<?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;
}

?>

0 голосов
/ 06 октября 2008

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

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

0 голосов
/ 06 октября 2008

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

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

...