В настоящее время я работаю над отдельным приложением для показа слайдов, которое показывает CSS-анимированные изображения вместе с музыкой.
До сегодняшнего дня изображения и музыка загружались прямо из их реального местоположения — это означало, что это местоположение и файлы должны были быть полностью доступны для публики, и любой мог просто открыть изображения и песни напрямую, не используя мое приложение. Это было хорошо для прототипирования и запуска — но теперь есть необходимость в более продвинутой защите от кражи.
Не поймите меня неправильно: Я знаю, что нет РЕАЛЬНОЙ защиты. Я просто хочу дать людям трудное время, когда дело доходит до прямой загрузки. Не должно быть возможности напрямую ссылаться на медиа-файл.
Вот что я придумал:
Изображения и песни загружаются через PHP — вы указываете идентификатор в качестве параметра, PHP ищет местоположение и обслуживает файл, если он найден. Кроме того, файл обслуживается только в том случае, если одноразовый номер, указанный в качестве параметра, действителен (существует и не старше 30 секунд). Одноразовый номер генерируется PHP и сохраняется в $_SESSION['nonce']
переменная.
<img src="image/imageid?nonce=[[nonce]]">
<audio><source src="song/songid?nonce=[[nonce]]"></audio>
В моем приложении у меня есть три функции:
(string) generateNone()
для генерации, сохранения сеанса и возврата одноразового значения -> используется в разметке для генерации ссылок(bool) validateNonce()
для проверки допустимости одноразового номера и последующего удаления, чтобы его нельзя было повторно использовать(void) initNonces()
для удаления всех одноразовых номеров из сеанса. Эта функция вызывается каждый раз, когда приложение загружается (не включая, конечно, отображение изображений и композиций), чтобы предотвратить накопление неиспользованных одноразовых номеров.Теоретически вся эта идея работает. Практически я столкнулся с двумя проблемами, которые не могу решить:
Кажется, изображения загружаются браузером: Когда изображения меняются с использованием jQuery / JavaScript (например, «скрыть изображение 1, показать изображение 2» или «скрыть изображение 4, показать изображение 5»), изображения не могут быть загружены, так как одноразовый номер больше не действителен (= уже использовался один раз ). Остановка одноразового удаления после проверки (= nonce можно использовать повторно) решает эту проблему, но это не является реальным решением. Эта проблема может быть связана с проблемой 2, поскольку jQuery изменяет только CSS-свойства для отображения и скрытия изображений.
Изображения и песни загружаются после одноразовой жизни: Кажется, браузер загружает изображения, которые изначально скрыты CSS, только когда изображение становится видимым. Хотя это обычно полезно для уменьшения использования полосы пропускания, в моем сценарии это предотвращает загрузку изображений и песен по истечении нерегулярного времени жизни 30 секунд. Мне нужен способ заставить браузер загружать все напрямую или, по крайней мере, открыть и удерживать соединение с запрошенным изображением / песней в течение 30 секунд.
Трудно определить реальную проблему, поэтому я надеюсь, что кто-то, кто знает, как браузеры внутренне обрабатывают загрузку мультимедиа, может подсказать, как исправить описанные проблемы. Если вам нужен какой-либо код, просто дайте мне знать.
Я прошу прощения за то, что спросил и ответил только несколько минут спустя — но я нашел решение после нескольких часов поиска, и я думаю, что это может быть полезно для кого-то, кто сталкивается с подобными проблемами:
Я использовал jQuery clone()
/ remove()
перезапустить CSS анимацию изображений. Чего я не знал, так это того, что это не только дублировало элемент, но и перезагружало все медиафайлы в нем, как это было в исходной разметке HTML. Таким образом, изображение перезагружалось — вызывая проблему, потому что одноразовый номер уже использовался.
Других решений пока нет …