Путаница с mysql_real_escape_string и strip_slashes
У меня есть пользователи, вводящие свое имя, как в: O'riley
,
Прежде чем ввести эти данные в базу данных MySQL, я запускаю mysql_real_escape_string
,
Проблема в том, что когда я затем выбираю эти данные для отображения и использования позже, они получаются как: O\'riley
,
Очевидно, что это предполагаемая операция. Что меня интересует, так это то, что есть возможность быть уверенным, что я смогу сохранить его в БД (все еще безопасно избегая возможного вредоносного кода), чтобы мне не приходилось использовать strip_slashes()
на выходе КАЖДЫЙ раз, когда я вызываю данные по всему веб-приложению? Или я что-то здесь упускаю?
Благодарю.
ОБНОВЛЕНИЕ Пожалуйста, обратитесь к комментариям в ответе Deceze.
9 ответов
Спасибо всем за ответы. Я награжу +50, но я хотел рассказать свое реальное решение здесь, все, с чем люди помогли...
Я выступал mysql_real_escape_string
на все данные, КАК СКОРО, как они размещены (перед любой обработкой). Итак, косая черта была добавлена, чтобы избежать '
персонаж, который был представлен. Мы знаем, что это нормально.
Тем не менее, не было никакой причины, что обратный слеш \
должен появиться в записи БД, верно? Побег был там, чтобы убедиться, что '
был введен.
Оказывается, ПОСЛЕ экранирования, я бы затем сохранял переменную для повторной загрузки на страницу в сеансе на случай, если у пользователя возникла ошибка, обнаруженная PHP при проверке всех полей формы. В этом случае ввод пользователя (ранее O'riley
был теперь напечатан на их экране как O\'riley
, Затем пользователь не уловил этого - поэтому он часто просто исправлял свою ошибку, которую обнаружил PHP во время проверки (не связанный с полем имени), и, таким образом, O\'riley
попадет в базу данных, потому что mysql_real_escape_string
будет избегать персонажей.
Урок: при обработке формы ПЕРВЫЙ сохраняйте данные для использования при заполнении формы. ВТОРОЙ проверить поля формы. ТРЕТЬЕ экранировать данные для обработки в базе данных.
Или еще лучше, используйте PDO и избегайте этого =).
Комментарии приветствуются. СПАСИБО ВСЕМ!
Нет, это не предназначенная операция для сохранения строки как "O\'riley"; он должен быть экранирован только в запросе, но не храниться таким образом. Я предполагаю, что PHP вставляет обратную косую черту через Волшебные Кавычки, и вы избегаете ее снова, чтобы заставить ее придерживаться.
Хорошо, вот что вам нужно сделать. Во-первых, на основе комментариев, из других вопросов:
ISOLATE
Вам необходимо определить причину проблемы. Это сервер? Это какой-то скрытый код где-то? Какие? Некоторые программисты могут включать такой код на странице конфигурации:
<?php if (isset($_POST))
foreach ($_POST as $key => $value) $_POST[$key] = addslashes($value);
?>
Итак, вот несколько проверок, чтобы увидеть, если это сервер. Это примерно настолько надежный способ проверки, насколько это возможно. Создать новую страницу. Оставьте это поле пустым и добавьте этот код:
<?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 позже. (Немного больше ненужных накладных расходов.)
Лично я всегда отключаю магические кавычки, потому что я делаю то, чего не велел делать. Если у вас нет возможности его отключить, рассмотрите возможность включения этого кода вверху всех ваших страниц.
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);
}
Если у вас отключены магические кавычки, а в случае, когда 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
установлен для регистрации таких ошибок (и это будет довольно раздражающим).
Использование
var_dump(get_magic_quotes_gpc());
где-то рядом с фактическим использованием опубликованных данных, чтобы увидеть, действительно ли отключены Magic Quotes.
Также некоторые странные фреймворки могут добавлять кавычки для вас, так что используйте ваш код для addslashes
и другие escape_string
-подобные функции.
Я бы честно предложил использовать PDO.
В PDO используется оператор подготовки и выполнения, что, в свою очередь, повышает безопасность и устраняет некоторые дополнительные проблемы.
$pdo = new PDO();
$stm = $pdo->prepare('INSERT... (LastName) VALUES (:LastName)');
$stm->execute(array(':LastName' => "O'Rily"));
$stm->fetchAssoc(PDO::FETCH_ASSOC);
Вам больше не нужно беспокоиться об удалении убегающих слешей, а также об обеспечении базовой тактики внедрения SQL.
Возможно, магические кавычки включены в ваш httpd.conf или в объявлении виртуального хоста.
Точное местоположение и файл будут зависеть от ОС и дистрибутива. Я бы проверил конфигурационные файлы Apache для настройки php_flag.
Просто используйте очистить данные перед вставкой в базу данных,
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)