update: чтобы узнать почему symlink() доступен не везде, гуглите "php open_basedir symlink shared"
Очередной раз пишу файловую свалку для форума. Была близкая тема здесь, но сейчас я ближе к реальности )))
Интересует что можно улучшить и как можно взломать предложенную схему.
Задача:
давать только избранным. Нет цели повторить rapidshare или типа того. Саму отдачу надо переложить на сервер, а не прокачивать через скрипт. То есть ссылки оформляю на скрипт в виде download.php?id=###, он проверяет права и если все ок, редиректит на "секретную ссылку" реальной отдачи. Решение должно быть портабельным, т.к. эту штуку я оформлю как open source расширение к движку форума. Вариант с созданием симлинков отпадает, конфигурирование httpd.conf тоже. Должно работать на шаред-хостингах где есть mod_rewrite и на Windows.
Рабочая идея:
Секретная ссылка содержит ключ доступа, соответствующий временному файлу. Временный файл создается в скрипте проверки прав. Этот же скрипт будет удалять просроченные файлы-ключи. Сервер проверяет есть ли такой ключевой файл и разрешает кач только в этом случае.
Пусть файлы на отдачу хранятся в реальной папке /upload/, имена как ####.ext (имя уникальное синтетическое, ext - реальное расширение файла)
файлы-ключи лежат там же, имена как ####-####.acs (расширение "acs" от "access"-доступ)
а секретная ссылка выглядит как
mysite.xx/download/####-####/File.ext
В корне сайта помещаем .htaccess
RewriteEngine on
# 1.prefix 2.fileId 3.accessId 4.name 5.ext
RewriteCond %{REQUEST_URI} (.*)/download/([0-9a-f]+)-([0-9a-f]+)/([^\.]+)\.([0-9a-z]+)
RewriteCond %{DOCUMENT_ROOT}%1/upload/%2-%3.acs -f
RewriteRule download/.* upload/%2.%5 [L]
Второй RewriteCond проверяет существует ли файл-ключ.
в папке /upload/ будет свой .htaccess
#Deny from All
Options -Indexes
RewriteEngine on
RewriteCond %{THE_REQUEST} !^.*/download/ [NC]
RewriteRule .* - [F]
К сожалению Deny from All я не могу включить, т.к. тогда вообще не получается качать из этой папки. Вместо этого я проверяю что ссылка на файл была "правильная", а не прямая. После первого .htaccess %{REQUEST_URI} содержит вместо /download/ уже /upload/, поэтому здесь я тестирую %{THE_REQUEST}, он по прежнему выглядит как "GET /download/####-####/File.ext HTTP…"
Ваши комментарии?