Как создать временные URL-адреса, чтобы предотвратить hotlinking в php?

Я хочу создать простой сайт для загрузки, который будет генерировать временные URL-адреса для видеофайлов после ввода кода. Мне нужно защитить истинное местоположение файлов, поэтому они не могут быть hotlinked напрямую. URL-адрес, основанный на времени, который истекает через x минут, кажется лучшим вариантом, но Im не уверен в фактической реализации.

Какие-нибудь советы?

Solutions Collecting From Web of "Как создать временные URL-адреса, чтобы предотвратить hotlinking в php?"

Сделайте свои URL следующим образом:

http://myvid.com/video?id=1&timestamp=12341561234&hash=1203941h23jk479sdf87sdf

Где временная метка – временная метка unix, а хеш – это хеш md5, скажем, временной метки, прикрепленной к секретной строке на сервере.

Затем, когда вы воспроизводите это видео, проверьте, действительно ли поле метки времени (с использованием хэша), а затем проверьте, сколько лет прошло с меткой времени.

Егор, они используют Mod Rewrite. Поэтому, когда кто-то заходит на сайт http://www.domain.com/video/1234567890/theLongHashCode, вы пишете в .htaccess, что URL следует рассматривать как video.php? Timestamp = 12341561234 & hash = 1203941h23jk479sdf87sdf

Это позволяет предотвратить отображение фактического URL-адреса.

Некоторые источники по mod rewrite: http://www.modrewrite.com/

Что вам нужно будет добавить в файл .htaccess, учитывая, что на Apache включен модуль mod_rewrite:

RewriteEngine On RewriteRule ^video/([0-9]+)/(.*) video.php?timestamp=$1&hash=$2 

Это занимает всего 2 значения: метка времени и хеш. Идентификатор видео не отправляется. Я бы даже не отправил метку времени. Для временного url я генерирую только хэш, сохраняю его в базе данных вместе с меткой времени. Поэтому, когда кто-то посещает URL-адрес, я просматриваю хэш из базы данных. Если хэш существует, то я сравниваю метку времени с базой данных с текущим временем, и если она находится в пределах срока, то URL считается действительным, в противном случае он недействителен и записывается на страницу «Эта ссылка истек».

Поэтому я бы хотел, чтобы url выглядел так: http://hsbsitez.com/video/thehashcodehere

Со следующим файлом .htaccess для интерпретации этого URL-адреса.

 RewriteEngine On RewriteRule ^video/(.*) video.php?hash=$1 

Где video.php – это файл, который проверяет, существует ли хэш в базе данных или нет.

 header('Content-Type: application/force-download'); $fileee = 'filename.zip'; $file_Location = "/..yourfolder/" . $fileee; header('Content-Length:' . filesize($file_Location)); header("Content-Disposition: inline; filename=\"".$fileee."\""); $file_Pointer = fopen($fileLocation,"rb"); fpassthru($file_Pointer); 

Используйте FORM с методом, заданным как PUT

Вы думали об использовании формы с методом PUT? Это в точности один из тех случаев, когда PUT предназначен для – неспособности обновить страницу с тем же URL. Просто создайте простую форму, содержащую несколько скрытых полей, и вы можете создать ссылку javascript, которая ее отправит. Таким образом, вам не нужно беспокоиться о том, что пользователи пытаются обновить ссылки или иметь ссылки в своей истории.

Пример:

 <form id="myform" method="put" action="viewimage.php"> <input type="hidden" name="id" value="uniquevalue" /> <input type="hidden" name="filename" value="foo.jpg" /> <a href="javascript:myFunctionToInvokeSumit()">Image foo.jpg</a> </form> 

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

Я бы рекомендовал не печатать весь файл через php, потому что он ресурсоемкий (даже fpassthru ). Существует еще один вариант – использование собственного скрипта для генерации пар temporary url => original url с rewritemap prg . Но этот вариант следует использовать осторожно.