PHP mysql_real_escape_string() -> Stripslashes(), оставляя несколько косых черт
-
19-09-2019 - |
Вопрос
У меня проблемы с экранированием/удалением строк с помощью PHP/MySQL - всегда появляются избыточные косые черты.
В качестве примера возьмем следующую строку:
<span style="text-decoration:underline;">underline</span>
При добавлении строки в базу данных я экранирую ее с помощью mysql_real_escape_string()
и следующее сохраняется в базе данных (РЕДАКТИРОВАТЬ:проверил это, запросив базу данных напрямую с помощью приложения MySQL):
<span style=\\\"text-decoration:underline;\\\">underline</span>
При обратном чтении из базы данных я передаю строку через stripslashes()
и возвращается следующее:
<span style=\"text-decoration:underline;\">underline</span>
Поскольку кавычки по-прежнему экранированы, HTML нарушается, и текст не подчеркивается.
- Почему
mysql_real_escape_string()
добавление трех косых черт иstripslashes()
убрать две косые черты?Я ожидаю, что они оба добавят/удалят одну косую черту. - Как я могу предотвратить это?
- Правильно ли я подхожу к этому?
Решение
Лучшее решение
В вашем файле php.ini есть вероятность, что magic_quotes_gpc
директива включена.Это следует отключить по соображениям безопасности.Если у вас нет доступа к файлу php.ini (например.на общем хосте) вы всегда можете сделать то же самое, используя директиву .htaccess (при условии, что это сервер Apache).
В вашем php.ini
magic_quotes_gpc Off
В файле .htaccess:
php_flag magic_quotes_gpc Off
Почему это происходит?
Причина, по которой это происходит, связана со следующей логикой.
- На сервер отправляется строка, которую необходимо экранировать.
This is my string. It's awesome.
- Magic Quotes экранирует апостроф прежде, чем он попадет в ваш код.
This is my string. It\'s awesome
mysql_real_escape_string
теперь нужно экранировать два символа: обратную косую черту\\
а также апостроф\'
.This is my string. It\\\'s awesome
- Эта новая суперэкранированная строка хранится в базе данных.
- Когда строка извлекается из базы данных, она передается в
stripslashes
.При этом будут удалены два escape-символа, добавленные на шаге 3, но поскольку одна из обратных косых черт была экранированаstripslashes
думает, что это принадлежит.This is my string. It\'s awesome
Эта проблема действительно может выйти из-под контроля, когда вы повторно отправляете эти строки в базу данных, поскольку каждый раз количество обратных косых черт умножается.
Альтернативное решение
Быстрая и простая альтернатива — просто удалить косые черты, добавленные magic_quotes
перед передачей строки в mysql_real_escape_string
.
$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);
Другие советы
При добавлении строки в базу данных я экранирую ее с помощью
mysql_real_escape_string()
и в базе данных сохраняется следующее:
<span style=\\\"text-decoration:underline;\\\">underline</span>
Нет, это не так.Когда вы экранируете строки в запросе sql, это делается только для передачи данных в запросе.База данных анализирует запрос и сохраняет данные в базе данных без каких-либо дополнительных косых черт.Таким образом, когда вы извлекаете данные из базы данных, вам следует нет скрыть что-либо.Это распространенное заблуждение.
Если вы обнаружите, что в выводе есть лишние косые черты, вероятно, у вас включены магические кавычки. Выключи их.
Редактировать:
mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
Как видите, запрос имеет на один уровень экранирования больше, чем данные появляются в базе данных и, следовательно, то, как они появляются при запросе.В вашем случае что такое вероятно Дело в том, что у вас включены магические кавычки, а затем вы экранируете строки перед их встраиванием в запрос.Это приводит к двойному экранированию и искажению ваших данных.Правильное решение — продолжать экранировать строки, как вы это делаете, но отключить магические кавычки.И не делать что-либо с данными по мере их поступления из базы данных.Помните, что данные, уже находящиеся в системе, необходимо сначала очистить.
Если get_magic_quotes_gpc()
отключен в SERVER, поэтому только мы можем использовать
$data= mysql_real_escape_string($_POST['data']);
если get_magic_quotes_gpc()
включен на SERVER, мы должны использовать
$data= mysql_real_escape_string(stripslashes($_POST['data']));
в противном случае добавьте к своим данным две обратную косую черту.
Также другое решение: мы можем использовать stripslashes($data)
при извлечении из базы данных, если мы используем только использование mysql_real_escape_string($_POST['data']);