Используя 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 вы должны установить правильный HTTP-заголовок. для использования é à ù с базой данных вы должны установить кодировку таблицы в utf8 и кодировку соединения в utf 8.