Всякий раз, когда я возвращался к кодированию для статистических веб-сервисов, мне приходилось динамически генерировать изображения и диаграммы. Сгенерированные изображения будут зависеть от параметра запроса, состояния хранилища данных и некоторой информации заголовка.
Поэтому на вашем месте я написал бы веб-сервис 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, и они решили спамить ваш сервер из чистого удовольствия. И даже в этом случае, если бы вы добавили гаечные ключи в стеки адресов секторов и карты подсекторов, было бы действительно трудно предсказать следующий токен.
Кстати, согласование циклического избыточного кода - это метод исправления ошибок, а не метод шифрования.