Правильный метод PHP для хранения специальных символов в БД MySQL

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

« " ' é à ù

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

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


person Antonio Ciccia    schedule 11.04.2012    source источник
comment
"ENT_QUOTES" должен быть ENT_QUOTES (без кавычек), потому что это предопределенная константа PHP. И я подумал, что вы можете поместить его в исходном виде в БД, и когда вы хотите повторить его, вы используете htmlentities   -  person Wouter J    schedule 12.04.2012


Ответы (4)


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

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

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

person Botanick    schedule 11.04.2012
comment
utf8 как кодировка столбцов таблицы - person Botanick; 12.04.2012
comment
вы не можете mysql_real_escape_string () несопоставимо с подготовленными операторами. Эта функция не предназначена для предотвращения инъекций и не может помочь против них в одиночку. - person Your Common Sense; 12.04.2012

Похоже, ваш вопрос можно обобщить на обработку и хранение 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

Имейте в виду, что PHP обычно не знает UTF-8, поэтому вам следует позаботиться о том, чтобы использовать либо iconv, либо < библиотеки href = "http://www.php.net/mbstring" rel = "nofollow"> _ 5_ для обработки строк. См. Хороший обзор PHPWACT.

Убедитесь, что для внутреннего набора символов PHP установлен Unicode.

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

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

Это должно сработать.

person jokkedk    schedule 11.04.2012

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

также вы можете использовать Prepared Statements, если вас очень беспокоят инъекции ...

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

person Sandeep Rajoria    schedule 11.04.2012

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

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

Это несравненные вещи. Одно дело хранить специальные символы, а другое - избегать инъекций. совершенно другой.

$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.

person Your Common Sense    schedule 12.04.2012
comment
$ book_text = htmlentities ($ book_text, ENT_QUOTES); при его размещении здесь произошла ошибка. В моем php-файле это было $ book_text = htmlentities ($ book_text, ENT_QUOTES); - person Antonio Ciccia; 12.04.2012