Можно ли поместить данные двоичного изображения в html-разметку, а затем получить изображение, отображаемое как обычно в любом браузере?
Это важная проблема безопасности, и я уверен, что это должно быть возможно.
Простой пример:
Вы запускаете портал сообщества. Пользователи регистрируются и загружают свои фотографии.
Ваше приложение предоставляет правила безопасности, когда изображение разрешено отображать. Например, пользователи должны быть друзьями с каждой стороны системой, чтобы вы могли просматривать другие загруженные фотографии.
Здесь возникает проблема: возможно, что кто-то сканирует каталоги изображений вашего сервера. Но вы хотите защитить своих пользователей от таких атак.
Если можно поместить двоичные данные изображения непосредственно в разметку HTML, вы можете ограничить доступ пользователей к вашим изображениям своим пользователям и сгруппировать свои веб-приложения и передать данные изображения своему пользователю Apache и группы непосредственно в HTML.
Единственная возможная слабость - это пароль пользователя, который работает в вашем веб-приложении.
Есть ли возможность?
Ответы
Ответ 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'));