PHP mysql_real_escape_string () -> stripslashes () оставляя несколько слешей - PullRequest
18 голосов
/ 06 октября 2009

У меня проблемы с экранированием / удалением строк с помощью PHP / MySQL - всегда есть избыточные слэши.

<ч />

Давайте возьмем следующую строку в качестве примера:

<span style="text-decoration:underline;">underline</span>


При добавлении строки в базу данных я экранирую ее с помощью mysql_real_escape_string(), и в базе данных сохраняется следующее ( EDIT : проверил это, выполнив запрос к базе данных напрямую с приложением 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. Правильно ли я подхожу к этому?

Ответы [ 3 ]

81 голосов
/ 06 октября 2009

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

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

При добавлении строки в базу данных я экранирую ее с помощью mysql_real_escape_string(), и в базе данных сохраняется следующее:

<span style=\\\"text-decoration:underline;\\\">underline</span>

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

Если вы обнаружите, что на выходе есть лишние косые черты, возможно, у вас включены магические кавычки. Выключите их .

Edit:

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)

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

1 голос
/ 06 февраля 2013

Если 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']);

...