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