2013-11-01 5 views
0

htmlspecialchars не будет работать на моей странице, чтобы удалить обратные косые черты перед тем, как избежать апострофов, размещенных там объектами pdo. Я предполагаю, что это потому, что я использую UTF-8 на своей странице для отображения китайских символов. Я пытаюсь отобразить абзац на английском языке и абзац на китайском языке. Это код, я использую:htmlspecialchars не конвертирует котировки

$english=htmlspecialchars($row["english"], ENT_QUOTES, 'UTF-8'); 

По какой-то причине он всегда отображается так:

Don\'t 

Там нет удаления экранирующего символа ...

+1

Почему вы думаете [htmlspecialchars] (http://php.net/manual/en/function.htmlspecialchars.php) * должен * удалить дескрипторы? (И почему вы храните такие косые черты в своей базе данных?) –

ответ

4
  1. Объекты PDO не размещены с косой чертой для '.
  2. htmlspecialchars() не снимать слэши
  3. Фактически некорректно избегать одиночных кавычек во время отображения в HTML, только двойные кавычки являются специальными символами.

Итак, обычно пример задачи XY (я могу показать этот вопрос студентам?)

Чтобы понять, что происходит неправильно, то вы должны знать следующие вещи:

  1. PHP может добавить \ для ввода аргументов, если magic_quotes включена - вам необходимо отключить их (через php.ini или в runtime для PHP < 5,3 выключают magic_quotes_sybase
  2. при вставке данных.. в базу данных вы (иногда) должны избегать одиночных кавычек. Обычно это делается с помощью функций PDO , если вы используете их правильно. Если вы используете bindParam, вам не нужно использовать какое-либо другое экранирование.
  3. При извлечении данных из базы данных могут возникнуть проблемы с magic_quotes_runtime, поэтому отключите их.
  4. Наконец, вы выводите свои данные в HTML - здесь вам нужно использовать htmlspecialchars(), но без каких-либо атрибутов, поскольку по умолчанию все в порядке.

Если у вас есть 1 или 2 проблемы - данные в базе данных уже могут быть повреждены, поэтому вам необходимо повторно сохранить их без неправильно добавило \ - для этого вы можете использовать stripslashes(), но только один раз повторно -сохранить данные. Во время обычной работы вашей системы вам необходимо использовать правильный подход.

+0

У меня был magic_quotes_gpc = В файле .ini, который, по-видимому, добавляет обратные слэши при использовании сообщения. Используя bindParam из данных post, будет ли это достаточным уровнем защиты от SQL-инъекции после отключения magic_quotes_gpc? – trueinViso

+0

@trueinViso yes, bindParam достаточно, чтобы избежать проблем с sql-инъекциями, просто используйте его для всех запросов и для всех переменных, magic_quotes были «изобретены» до того, как PDO пришел, и вот почему теперь php имеет проблемы, если оба используются –

+0

Спасибо за помощь , – trueinViso

0

заменить переменный это:

$english = stripslashes(htmlspecialchars($row["english"], ENT_QUOTES, 'UTF-8')); 

участок с полосками будет избавлен от косых черт, но это может быть un-saniti ze ваша строка.

2

Don \ 'т

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

Смежные вопросы