Подтвердить что ты не робот

PHP mysql_real_escape_string() → stripslashes(), оставляющий множественные слэши

У меня возникли проблемы с экранированием/удалением строк с помощью 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() удаление двух слэшей? Я ожидаю, что они оба добавят/удалят одну косую черту.
  • Как я могу предотвратить это?
  • Я подхожу к этому правильным способом?
4b9b3361

Ответ 1

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

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

В php.ini

magic_quotes_gpc Off

В файле .htaccess:

php_flag magic_quotes_gpc Off

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

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

  • Строка, которая требует экранирования, отправляется на сервер.
    • This is my string. It awesome.
  • Волшебные цитаты избегают апострофа, прежде чем он попадет в ваш код.
    • This is my string. It\ awesome
  • mysql_real_escape_string теперь имеет два символа для выхода, обратная косая черта \\, а также апостроф \'.
    • This is my string. It\\\ awesome
  • Эта новая суперэкранированная строка сохраняется в базе данных.
  • Когда строка извлекается из базы данных, она переходит к stripslashes. Это удаляет два escapes, добавленных на шаге 3, но так как одна из обратных косых черт была экранирована stripslashes считает, что она принадлежит.
    • This is my string. It\ awesome

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

Альтернативное решение

Быстрая и простая альтернатива - просто удалить косые черты, добавленные magic_quotes, прежде чем передать строку в mysql_real_escape_string.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

Ответ 2

При добавлении строки в базу данных я избегаю ее с помощью 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)

Как вы можете видеть, запрос имеет еще один уровень экранирования, чем данные отображаются в базе данных и, следовательно, как это получается при запросе на него. В вашем случае, что, вероятно, происходит, заключается в том, что вы включили магические кавычки, а затем вы избегаете строк, прежде чем встраивать их в запрос. Это приводит к двойному экранированию, подделке ваших данных. Правильное решение состоит в том, чтобы сохранить escape-строки, как вы, но отключите магические кавычки. И ничего не делайте с данными, поскольку они выходят из базы данных. Помните, что данные, которые уже в системе должны быть очищены в первую очередь.

Ответ 3

Если отключено в SERVER, поэтому мы можем использовать

$data= mysql_real_escape_string($_POST['data']);

if get_magic_quotes_gpc() включен в SERVER, мы должны использовать

$data= mysql_real_escape_string(stripslashes($_POST['data']));

в противном случае добавьте две обратные косые черты с вашими данными.

Еще одно решение - мы можем использовать stripslashes($data) при извлечении из datadase, если использовать только mysql_real_escape_string($_POST['data']);