Google Storage или Amazon S3 или Google App Engine BlobStore - PullRequest
17 голосов
/ 02 июля 2011

Я собираюсь создать сайт с помощью Google App Engine. Мой публичный сайт содержит тысячи картинок. Я хочу хранить эти изображения в облаке: Google Storage или Amazon S3 или Google App Engine BlobStore. Проблема заключается в горячей ссылке на изображение.

  1. Что касается Google Storage, я гуглил и не могу найти способ предотвратить хотлинкинг изображений. (Хотя мне очень нравится его инструмент командной строки gsutil)

  2. Amazon S3 имеет «Строковую аутентификацию запроса», которая генерирует URL-адреса изображений с истекающим сроком действия. Но это очень плохо для SEO, не так ли? Постоянное изменение URL-адреса может иметь весьма негативные последствия, так как для добавления изображения и связанного с ним URL-адреса в Google Images требуется более года. Я уверен, что изменение этого URL-адреса сразу же окажет негативное влияние, когда робот Google придет сказать привет. ( ОБНОВЛЕНИЕ: более эффективный способ предотвращения горячей ссылки на изображения в Amazon S3 с помощью реферера - использовать Bucket Policy. Подробности здесь: http://www.naveen.info/2011/03/25/amazon-s3-hotlink-prevention-with-bucket-policies/)

  3. Google App Engine BlobStore? Я должен загрузить изображения через веб-интерфейсы вручную, и тоже генерирует изменяющиеся URL . ( обновление: из-за моего незнания о Blobstore я только что допустил ошибку. Используя BlobStore движка приложений Google, вы можете использовать любой URL для показа нужного вам изображения. )

Мне нужна простая защита реферера: показывать изображение, только если реферер является моим сайтом.

Существуют ли более эффективные способы предотвращения хотлинкинга изображений. Я не хочу банкротства из-за чрезвычайно высокой стоимости пропускной способности облака.

UPDATE:

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

Ответы [ 4 ]

7 голосов
/ 04 июля 2011

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

Я бы посоветовал подумать о том, является ли это реальной практической проблемой, с которой вы сталкиваетесь. Пропускная способность, потребляемая несколькими изображениями с горячей связью, по современным меркам довольно минимальна, и, во-первых, это не очень распространенная практика. Как отмечает @sharth в комментариях, это, вероятно, также повлияет на SEO, поскольку поиск изображений, как правило, показывает изображения в их собственных окнах в дополнение к ссылкам на страницу, на которой они размещены.

1 голос
/ 02 июля 2011

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

Поэтому на вашем месте я написал бы веб-сервис REST для обслуживания изображений. Не слишком сложно Это тоже довольно щекотливо, потому что, если вам не нравится конкретный IP-адрес, вы можете показать мультфильм с высунутым выражением (или анимированный GIF-файл с танцами самбы OBL во время бомбежки), а не изображение для запроса данных.

В вашем случае вы бы проверили реферер (или реферер) в заголовке http, верно? Я сомневаюсь, потому что люди могут и будут скрывать, исключать или даже подделывать поле referer в заголовке http.

Итак, не только проверьте поле реферера, но и создайте поле данных, в котором значение изменяется. Значение может быть простым совпадением значений.

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

Вместо стека дисков ваши потребители образов и поставщик изображений будут иметь один и тот же стек 32-битных токенов. 32 бита дадут вам ~ 4 миллиарда десятиминутных периодов. Стек случайным образом упорядочен. Поскольку хорошо известно, что «случайные генераторы» не являются действительно случайными и на самом деле алгоритмическими в некотором смысле, который можно предсказать, если предоставить достаточно длинную последовательность, вы должны либо использовать «истинный генератор случайных чисел», либо повторять последовательность стеков каждую неделю.

Из-за проблем с задержкой ваш провайдер будет принимать токены текущего периода, последнего периода и следующего периода. Где точка = сектор.

Ваш ajax-клиент (предположительно gwt) в вашем браузере будет получать обновленный токен с сервера каждые десять минут. Клиент ajax будет использовать этот токен для запроса изображений. Служба поставщика изображений отклонит устаревший токен, и вашему ajax-клиенту придется запросить свежий токен с сервера.

Это не огнестойкий метод, но он небьющийся, так что он может уменьшить / предотвратить количество спам-запросов (я полагаю, почти до нуля).

Способ, которым я генерирую «действительно случайные» последовательности, снова быстрый и грязный. Далее я работаю над алгоритмически сгенерированной «случайной» последовательностью, потратив несколько минут, вручную добавляя несколько гаечных ключей, вручную упорядочивая или удаляя значения последовательностей. Это испортит любую алгоритмическую предсказуемость. Возможно, вы могли бы написать метатель гаечного ключа. Но алгоритмический метатель гаечных ключей просто добавил бы предсказуемый алгоритм над другим предсказуемым алгоритмом, который вообще не снижает общую предсказуемость.

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

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

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

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

Допустим, у вас есть 16-битные адреса секторов, а каждый сектор имеет 16-битные адреса подсекторов, что составляет 32-битный токен. Это означает, что вы можете позволить себе иметь 65536 одновременно работающих браузерных клиентов, несущих один и тот же сектор токенов, но в которых нет двух токенов с одинаково низким значением предсказуемости. Чтобы вы могли назначить значение подсектора токена для каждого идентификатора сеанса. Если у вас не более 65536 одновременных сеансов для службы поставщика изображений, никакие два идентификатора сеанса не должны будут использовать один и тот же адрес токена подсектора. Таким образом, если у спаммера не было доступа к оборудованию / средствам подделки идентификатора сеанса, ваш провайдер изображений не мог бы спамить, кроме как через атаку отказа в обслуживании.

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

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

Кстати, согласование циклического избыточного кода - это метод исправления ошибок, а не метод шифрования.

0 голосов
/ 20 марта 2012

Вы должны знать, что File API все еще экспериментален, проверьте эту проблему:

http://code.google.com/p/googleappengine/issues/detail?id=6888#c20

Я работаю над стартапом, который перемещается из Blobstore в Amazon S3

0 голосов
/ 02 июля 2011

Упрощенная версия эссе geek, создайте обработчик в google app engine, чтобы получать и отправлять изображения на сервер.Вы можете изменить заголовки, указав png или что-то еще, но вы возвращаете изображение из другого места.Затем вы можете просмотреть информацию о реферере вашего запроса в обработчике и предпринять соответствующие действия, если кто-то пытается получить доступ к этому изображению «горячей ссылки».Конечно, поскольку вы никогда не выставляете фактическое изображение, хотлинк будет невозможно.=) * * Тысяча одна

...