PHP - Mysql: хранение изображений в БД - экранирование специальных символов - PullRequest
5 голосов
/ 31 декабря 2010

Я прочитал этот урок о хранении изображений в БД. В этом учебнике автор экранирует специальные символы в двоичных данных перед вставкой: http://www.phpriot.com/articles/images-in-mysql/7 (используя addslashes, хотя mysql_real_escape_string предпочтительнее, но это другая проблема).

Дело в том, что при отображении он просто отображает данные в том виде, в котором они хранятся: http://www.phpriot.com/articles/images-in-mysql/8

Мои вопросы:

1) Нужно ли экранировать специальные символы даже для двоичного типа поля (blob)?

2) Если так, то не нужно ли нам снова «убирать» символы, чтобы правильно отобразить изображение? (Если это так, каков наилучший способ сделать это. Любые комментарии об эффективности? Для больших изображений: экранирование и удаление могут быть большими издержками?).

Или это мое понимание об экранировании совершенно неверно (и экранирование влияет только на запрос, а не на окончательные данные, вставленные / сохраненные?).

спасибо

JP

Ответы [ 2 ]

6 голосов
/ 31 декабря 2010

Ваше понимание побега неверно. Данные, вставляемые в базу данных, экранируются, поэтому анализатор запросов видит информацию, как задумано.

Возьми струну "Жан-Люк" Эрл Грей "Пикард". Экранирование результатов в: 'Jean-Luc \'Earl Grey\' Picard'

Когда MySQL получает это, он понимает, что экранированные кавычки должны восприниматься буквально, именно это означает экранирование, и сохраняет их в базе данных. Он не будет хранить escape-символы в базе данных. \ Указывает MySQL, что символ буквально следует за ним.

При извлечении данные представляются вашему приложению без экранирующих символов, так как они удаляются при разборе запроса.

1 голос
/ 31 декабря 2010

1) Нужно ли экранировать специальные символы даже для двоичного типа поля (blob)?

Да, потому что mysql_real_escape_string() (который действительно используется) обеспечивает защиту от атак с использованием SQL-инъекций, которые также могут легко находиться внутри файла образа. Любые произвольные данные, которые вы вводите в базу данных, должны быть сначала обработаны.

...