PHP mysql_real_escape_string() -> Stripslashes(), оставляя несколько косых черт

StackOverflow https://stackoverflow.com/questions/1522313

Вопрос

У меня проблемы с экранированием/удалением строк с помощью 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 нарушается, и текст не подчеркивается.


  1. Почему mysql_real_escape_string() добавление трех косых черт и stripslashes() убрать две косые черты?Я ожидаю, что они оба добавят/удалят одну косую черту.
  2. Как я могу предотвратить это?
  3. Правильно ли я подхожу к этому?
Это было полезно?

Решение

Лучшее решение

В вашем файле php.ini есть вероятность, что magic_quotes_gpc директива включена.Это следует отключить по соображениям безопасности.Если у вас нет доступа к файлу php.ini (например.на общем хосте) вы всегда можете сделать то же самое, используя директиву .htaccess (при условии, что это сервер Apache).

В вашем php.ini

magic_quotes_gpc Off

В файле .htaccess:

php_flag magic_quotes_gpc Off

Почему это происходит?

Причина, по которой это происходит, связана со следующей логикой.

  1. На сервер отправляется строка, которую необходимо экранировать.
    • This is my string. It's awesome.
  2. Magic Quotes экранирует апостроф прежде, чем он попадет в ваш код.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string теперь нужно экранировать два символа: обратную косую черту \\ а также апостроф \'.
    • This is my string. It\\\'s awesome
  4. Эта новая суперэкранированная строка хранится в базе данных.
  5. Когда строка извлекается из базы данных, она передается в 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']);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top