2013-05-21 2 views
1

Я пытаюсь получить изображение из обработчика HTTP.Obfuscate HTTP-обработчик, предназначенный для возврата изображения

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

Вот пример:

  1. ASPX-страница делает вызов обработчика (picService.ashx ID = 1?), Проходящую в ID с помощью строки запроса
  2. HTTP-обработчик отправляет обратно изображение
  3. The Источник изображения - Сервисы/picService.ashx? id = 1

Все это работает нормально. Теперь, если пользователь хочет пойти и посетить picService.ashx и ввести любой старый идентификатор, он вернет изображение, которое соответствует этому идентификатору. Я работаю с конфиденциальной информацией, поэтому это неприемлемо.

Я просмотрел HTTP-запрещенные обработчики, но не уверен, иду ли я по правильному маршруту.

Я также попытался вернуть изображение на странице ASPX, но вы не можете сделать это из-за того, что элемент управления Image должен иметь URL-адрес.

Как я могу вернуть изображение из базы данных и обеспечить безопасность изображения?

Должен ли я делать это по-другому? Или я на правильном пути (http запрещен)?

+0

Определить «безопасный» – StingyJack

+0

Клиенты не должны иметь прямой доступ к сервису и получать изображения. Этот вопрос касается многих способов достижения этого. – Robbie

+0

Зачем вам нужно поселиться для обфускации, а не для обеспечения надлежащей безопасности? – bmm6o

ответ

5

Техника, которую я использовал в прошлом, состоит в том, чтобы страница (шаг 1) создала GUID и зарегистрировала элемент кэша с ключом GUID, который имеет фактический URL-адрес изображения в объекте. Страница строит URL-адрес для обработчика, используя идентификатор GUID и переходит к обработчику

Обработчик (шаг 2) затем знает, чтобы перейти в кеш, чтобы получить фактическое значение и вернуть содержимое.

Таким образом вы выставляете только временное «волшебное» значение. Это определенно обфускация, а не замена надлежащей безопасности.

В качестве примера (из памяти, синтаксис может быть выключен немного)

В ASPX или вызывающих

string keyValue = Guid.NewGuid().ToString(); 
    int yourImageID = 5; 

    Cache.Add(keyValue, yourImageID) //expire in 5 or 10 seconds 
    string url = "Handler.ashx?imgID=" + HttpUtility.UrlEncode(keyValue); 
    Response.Redirect(url, false); 

В обработчике (я использую ASHX в основном, выбрать то, что подходит для вашей потребности)

string key = HttpUtility.UrlDecode(context.Request.QueryString.Get("imgID")); 

int yourImageID = (int) context.Cache.Get(key); 

//get your image from the db and return the content 

Опять же, только потому, что я использовал GUID не означает, что у вас есть, но если вы пытаетесь запутать Идентичность, а затем выбрать то, что не коррелируют к единичному.

+0

Любой шанс вы могли бы привести пример этого? (Я понятия не имею, боюсь) Я думал об использовании одностороннего хэширования идентификатора (идентификаторы последовательно генерируются 8-значными значениями), сохраняя это в таблице, а затем просматривая реальное значение, но это могло бы либо быть в безопасности, если клиент знал, о чем идет речь, поскольку все пользователи знают, что такое их идентификатор, и очевидные издержки базы данных. – Robbie

+0

Это прекрасно работает. Спасибо за всю помощь, отметив как ответ, хотя Тимин предложил то же самое, вы были первым и достойным примером. – Robbie

0

Прежде всего, вы должны знать, что вы считаете ОК, чтобы показать фотографию. Каков ваш параметр проверки подлинности. Например, если пользователь разрешает видеть pic при аутентификации, проверьте его на странице ashx, прежде чем разрешить ему видеть. Поскольку вызов внутри html как src или размещение его в браузере не имеет никакого значения для сервера.Таким образом, вам нужно проверить некоторую проверку в случае, если пользователь вообще не должен видеть это напрямую или напрямую.

+0

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

+1

@ Robbie, чтобы снизить производительность, вы можете использовать кеш для хранения аутентификации пользователя. – Devesh

0

Сохраните URL-адрес и параметр в состоянии сеанса и получите доступ к сеансу в HttpHandler. Для этого вам нужно будет implemement в IRequiresSessionState в обработчике:

Problem with HttpHandler and session state

Getting Session State in HttpHandlers (ASHX files)

+0

Сессия обычно не рекомендуется в связи с последствиями производительности. – StingyJack

+0

Производительность будет только проблемой с действительно большими изображениями. – IrishChieftain

+0

Нет, производительность уменьшается по мере увеличения количества пользователей и объектов на пользователя, которые хранятся в сеансе. Это не имеет ничего общего с хранилищем изображений. – StingyJack

2

Как вы слово на ваш вопрос не существует никакого способа, чтобы получить его 100% безопасным. Итак, какие компромиссы вы готовы разрешить, а какие нет?

Что именно вы пытаетесь предотвратить? Только один пользователь не видит изображение другого пользователя? Или предотвратить right-click, save image as?

Одна идея, которая приходит на ум, заключается в объединении IP-адреса пользователя с идентификатором изображения, хешем, который выбрасывает его в кеш (или используйте руководство в качестве ключа для поиска этих значений). Возможно, удалите его из кеша, как только этот хеш будет использоваться, поэтому разрешите загружать только изображение один ip на странице он должен быть включен.

Вы должны уметь отображать сопоставление между сгенерированным идентификатором и реальным в сеансе или HttpRuntime.Cache.Insert(cacheName, cachedValue). База данных, вероятно, не самый лучший ответ, это небольшие объемы данных, и вы можете установить время истечения на небольшое значение , так что, если у вас нет миллионов пользователей за раз ...

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

+0

Спасибо за все идеи и вызовы, которые вы выдвинули. Каждый пользователь должен увидеть несколько изображений на странице, эти изображения можно обновить и показать снова и снова и снова. Редактировать: Случайно нажата enter. Хорошая точка окончания сессии. Довольно много разных вещей, чтобы думать о нем. У меня нет проблем с загрузкой изображений пользователями, поскольку они должны иметь к ним доступ в первую очередь. Моя забота заключалась в том, что любой мог запросить обработчик с идентификатором, чтобы затем получить изображение. – Robbie

+1

Из этого, я думаю, я бы сказал, просто сгенерировал случайное число или GUID, и пусть эта карта будет отображаться на Id в течение некоторого времени. Однонаправленные хэши только идентификатора не будут действительно работать, вам нужно что-то не на основе фактического идентификатора, чтобы он не мог быть создан логически. Не могли бы вы изменить базу данных на использование GUID в качестве первичного ключа? Это решило бы многие из ваших проблем, не требуя дополнительного слоя отображения – Thymine

+0

К сожалению, база данных не предоставлена ​​поставщиком, и эта проблема не будет считаться важной, чтобы оправдать такие большие изменения, идентификатор является одним из самых важных уникальных идентификаторы. Я буду исследовать завтра по истечении срока действия кеша и сеанса, и который будет лучшим. – Robbie

Смежные вопросы