Я просто переехал в новую хостинговую компанию, и теперь всякий раз, когда строка сбегает, используя:
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 моих веб-серверов.
Любая помощь будет оценена по достоинству.
Благодарю.
Хост, который вы переместили, вероятно, включил magic_quotes_runtime
. Вы можете отключить его с помощью set_magic_quotes_runtime(0)
.
Отключите magic_quotes_runtime
, а затем измените свой код на использование переменных привязки, а не на использование escape-последовательности.
Я могу думать о нескольких вещах, которые могут вызвать это. Но это зависит от того, как вы вызываете 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, а не просто изменили конфигурацию (которая, возможно, не сработала).
в базе данных остаются слэш.
Это означает, что ваши данные удваиваются.
Возможны две причины:
волшебные цитаты включены , несмотря на ваши чувства. Дважды проверьте его
В вашем приложении есть какой-то код, который просто имитирует магическое поведение котировок, избегая всех входных данных.
Это очень распространенное заблуждение, чтобы иметь общую функцию экранирования для «защиты» всех входящих данных. Хотя он вообще не подходит, он также несет ответственность за такие случаи.
Из-за этого – просто найдите эту функцию и уничтожьте ее.
это звучит так, как будто у вас есть волшебные цитаты. Отключение этого не слишком сложно: просто создайте файл в корневом каталоге с именем .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()
не будет их mysql_real_escape_string()
.
Вероятно, вы должны включить магические цитаты. Выяснить, как именно отключить его, может быть довольно большая головная боль в PHP. Хотя вы можете отключить магические кавычки с помощью set_magic_quotes_runtime(0)
, этого недостаточно – магические кавычки уже изменили входные данные в этот момент, поэтому вы должны отменить изменение. Попробуйте этот фрагмент: http://talks.php.net/show/php-best-practices/26
Или еще лучше – отключите магические кавычки в php.ini
и любые файлы .htaccess, в которые он может быть установлен.
Я не уверен, правильно ли я понял проблему, но у меня была такая же проблема. Независимо от того, что я сделал, косые черты были там, когда струна сбежала. Поскольку мне нужно, чтобы вставленное значение находилось в том же формате, в котором он был введен, я использовал
htmlentities($inserted_value)
это оставит все вставленные метки кавынок незакрепленными, но безвредными.
Что может быть проблемой (это было с нами), что вы используете mysql_real_escape_string()
несколько раз в одном и том же var. Когда вы будете использовать его несколько раз, он добавит косые черты.
Функция ниже правильно удалит косые черты перед вставкой в базу данных. Я знаю, что вы сказали, что магические кавычки не включены, но что-то добавляет косые черты, поэтому попробуйте следующую страницу и посмотрите результат. Это поможет выяснить, где. Вызовите с помощью page.php? Var = something-with'data_that;
Вы, скорее всего, увидите номер три, выводящий больше слэшей, чем нужно.
* Измените детали 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; }
?>
mysql_real_escape_string($str);
должен делать именно это. он предназначен для добавления обратных косых черт к специальным символам, особенно если вы хотите передать запрос в mysql. Обратите внимание, что он также учитывает набор символов mysql.
Для более безопасных методов кодирования было бы полезно отредактировать код и использовать stripslashes()
для считывания данных и удаления косой черты.