Исправить PHP-метод для хранения специальных символов в MySQL DB

Используя PHP, как лучше всего хранить специальные символы (например, следующие) в базе данных MSQUL, чтобы избежать инъекций.

« " ' é à ù 

Вот как я это делаю сейчас:

 $book_text=$_POST['book_text']; $book_text=htmlentities($book_text, "ENT_QUOTES"); $query=//DB query to insert the text 

Затем:

 $query=//DB query to select the text $fetch=//The fetch of $book_text $book_text=html_entity_decode($book_text); 

Таким образом, весь текст отформатирован в HTML-сущности. Но я думаю, что это занимает много места в базе данных. Итак, есть ли лучший способ?

Для сохранения этих значений используйте кодировку utf8 .

Чтобы избежать инъекций, используйте mysql_real_escape_string() (или подготовленные операторы).

Для защиты от XSS используйте htmlspecialchars .

Похоже, ваш вопрос может быть обобщен для обработки и хранения UTF8 с PHP и MySQL.

Чтобы быть в безопасности от SQL-инъекций, вы должны использовать подготовленные операторы. Драйверы mysqli и PDO поддерживают их.

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

Таблицы базы данных должны быть созданы с помощью набора символов utf8 и сортировки utf8_general_ci . Эти настройки my.cnf гарантируют, что ваш сервер MySQL будет запускать UTF8:

 [mysqld] default-character-set=utf8 default-collation=utf8_general_ci character-set-server=utf8 collation-server=utf8_general_ci init-connect='SET NAMES utf8' [client] default-character-set=utf8 по [mysqld] default-character-set=utf8 default-collation=utf8_general_ci character-set-server=utf8 collation-server=utf8_general_ci init-connect='SET NAMES utf8' [client] default-character-set=utf8 по [mysqld] default-character-set=utf8 default-collation=utf8_general_ci character-set-server=utf8 collation-server=utf8_general_ci init-connect='SET NAMES utf8' [client] default-character-set=utf8 

Имейте в виду, что PHP, как правило, не знает UTF-8, поэтому вам следует позаботиться об использовании библиотек iconv или mbstring для обработки строк. См. PHPWACT для хорошего обзора.

Убедитесь, что внутренний набор символов PHP установлен в unicode

 iconv_set_encoding('internal_encoding', 'UTF-8'); mb_internal_encoding('UTF-8'); 

Вы также должны убедиться, что браузер знает кодировку, отправив либо правильный заголовок, либо добавив <meta> для кодировки.

Это должно сделать это.

yes utf8 encoding …

также вы можете использовать подготовленные заявления, если вы сильно беспокоитесь об инъекциях …

http://www.linearchat.co.uk/2011/08/why-prepared-statements-in-mysql-are-a-good-thing/

также

http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

Ваш вопрос – прекрасная коллекция замешательств. Вы все запутали.
Попробуем разобраться.

Используя PHP, как лучше всего хранить специальные символы (например, следующие) в базе данных MSQUL, чтобы избежать инъекций.

Это несравненные дела. Хранение особых символов – одно дело, и избежать инъекций – другое. совершенно другой.

 $book_text=htmlentities($book_text, "ENT_QUOTES"); 

это самая смешная часть. хотя он предназначен для защиты ваших запросов, он фактически ничего не делает. Потому что вместо константы ENT_QUOTES, значение которой равно 3, вы используете строку ENT_QUOTES, числовое значение которой равно 0, поэтому вы не устанавливаете флаг.

Но даже если вы правильно установили этот флаг, он не будет автоматически защищать вас. Потому что код инъекции может не содержать специальных символов.

Чтобы избежать инъекций, вы должны следовать целому набору правил , а не одной простой функции «make_my_data_safe ()». Нет волшебной палочки.
См. Мой ответ для деталей.

Что касается специальных чар, это просто. Единственная проблема, что нет никаких специальных специальных символов. Существуют разные специальные символы для разных сред.

  • 'имеют смысл для базы данных и HTML
  • <> имеют значение только для HTML
  • é à ù имеют смысл только для HTML, зависит от кодировки.

вы используете разные правила форматирования для каждого случая. Разные, ни одного для всех.

для использования é à ù символов с HTML вы должны установить правильный HTTP-заголовок. для использования é à ù с базой данных вы должны установить кодировку таблицы в utf8 и кодировку соединения в utf 8.