Действительно ли возможно поместить данные двухуровневого изображения в разметку HTML и затем отобразить изображение, как обычно, в каком-либо браузере?

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

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

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

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

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

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

Уже существует ли возможность?

49
задан Joern Akkermann 11 March 2010 в 17:15
поделиться

5 ответов

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

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

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

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

86
ответ дан 7 November 2019 в 11:36
поделиться

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

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

например:

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

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

12
ответ дан 7 November 2019 в 11:36
поделиться

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

<img src="/images/getImage.aspx?id=123353 />
3
ответ дан 7 November 2019 в 11:36
поделиться

В HTML5 для этого можно использовать тег холста и JavaScript.

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

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

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

0
ответ дан 7 November 2019 в 11:36
поделиться

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

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

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

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

Пример PHP:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
2
ответ дан 7 November 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: