Правильный метод 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-сущности. Но я думаю, что это занимает много места в базе данных. Есть ли лучший способ?

4 ответов


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

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

для защиты от межсайтовый скриптинг использовать htmlspecialchars.


похоже, ваш вопрос можно обобщить на обработку и хранение UTF8 с PHP и MySQL.

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

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

таблицы базы данных должны быть созданы с помощью набора символов utf8 и utf8_general_ci сопоставление. Эти мои.настройки 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

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

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

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

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

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


да кодировка utf8...

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

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, чтобы избежать инъекций.

это несравнимые вещи. Хранить специальные chars одно дело и во избежание впрыски другое. совершенно другой.

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

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

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

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

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

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

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

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