Подтвердить что ты не робот

Можно ли поместить данные двоичного изображения в html-разметку, а затем получить изображение, отображаемое как обычно в любом браузере?

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

Простой пример:

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

Здесь возникает проблема: возможно, что кто-то сканирует каталоги изображений вашего сервера. Но вы хотите защитить своих пользователей от таких атак.

Если можно поместить двоичные данные изображения непосредственно в разметку HTML, вы можете ограничить доступ пользователей к вашим изображениям своим пользователям и сгруппировать свои веб-приложения и передать данные изображения своему пользователю Apache и группы непосредственно в HTML.

Единственная возможная слабость - это пароль пользователя, который работает в вашем веб-приложении.

Есть ли возможность?

4b9b3361

Ответ 1

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

Используйте тег <img> следующим образом:

<img src="data:image/gif;base64,xxxxxxxxxxxxx...">

Где часть xxxxx... - это кодировка base64 данных изображения gif.

Ответ 2

Если бы я нуждался в безопасности в каталоге изображений, я бы вообще не обнаружил каталог. Вместо этого мои атрибуты img src будут ссылаться на страницу, в которой в качестве параметра будет использоваться идентификатор пользователя и идентификатор изображения.

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

например:

<img src="imgaccess.php?userid=1111&imgid=223423" />

Кроме того, я бы не использовал допустимые id. Вместо того, чтобы придерживаться чего-то вроде базового 64 кодированного guid.

Ответ 3

Я не уверен, что понимаю, но здесь. Вместо того, чтобы обслуживать статические изображения, которые находятся в папке с изображениями, почему вы не можете использовать выбранную вами технологию на стороне сервера, чтобы изображения были динамически отправлены клиенту? Таким образом, ваш код на стороне сервера может попасть в микс и разрешить или запретить доступ программно?

<img src="/images/getImage.aspx?id=123353 />

Ответ 4

С HTML5 вы можете использовать теги canvas и JavaScript для этого.

Возможно, вы можете что-то сделать с помощью CSS или таблицы, чтобы нарисовать картинку (возможно, очень плохую производительность, разрешение, переносимость).

В любом случае, нет возможности остановить людей от ваших фотографий. Они могут сделать снимок экрана и обрезать его.

Как сказал Крис в своем ответе, имея длинный идентификатор изображения, так что URL-адрес для каждого изображения нелегко угадать или грубая сила. И список каталогов в ваших каталогах веб-серверов также отсутствует.

Ответ 5

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

<img src="/app/getImage.xyz?image=12345&token=12a342e32b321" />

Шансы очень редки, что кто-то будет скорректировать правильный токен в нужное время с правильным изображением. Есть, по крайней мере, возможности проверить токен в "getImage" :

  • Отслеживать все теги изображений в вашем приложении и хранить записи в базе данных, которые связывают случайно созданные маркеры и идентификаторы изображений с запрашивающими пользователями. Затем действие "getImage" проверяет предоставленные параметры для этой базы данных.
  • Создайте токен в качестве контрольной суммы (MD5, CRC, что угодно) по идентификатору пользователя, идентификатору изображения и, возможно, текущему дню года, и обязательно смешайте его в неопознанной соли. Действие "getImage" затем пересчитает контрольную сумму и проверит ее против указанного, чтобы проверить доступ пользователя. Этот метод будет давать меньше накладных расходов, чем первый.

Пример PHP:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));