Возникла проблема - не давать скачивать файлы для незарегистрированных пользователей на одном из сайтов.
1. Неужели на одном сайте при существовании двух index.php в разных директориях сессия не может оставаться одной и той же (натурально воспринимается как 2 сайта, сессия уничтожается...)

2. Забили на сессию, делали через БД... написали .htaccess такой, что любой запрос файла перенаправляется на index.php?file=запрошенный_файл.... Наблюдали как лихо страница обновляется 1000 раз, находя по маске в адресе опять тот же (.*)$ и перенаправляя ещё дальше

3. Третий вариант кое как заработал.... вопрос - как отдать файл клиенту? т.е. запросили картинку - попали на обабатывающий файл - тобы в случае успешных проверок файл выдал именно файл? что-то типа include(запрошенный файл) (p/s/ инклуд очень красиво выводит файл как текст, наверняка есть способ? Как всем известные файловые серверы делают?)

P/S/ не стали мудрить, тупо запретили прямые ссылки на файлы, но ответы на вопросы пока не узнаю, не засну) Заранее спаибо)


@темы: Сервер, PHP, Вопросы

Комментарии
12.10.2007 в 01:46

 
1. По умолчанию, сессия определяется кукой PHPSESSID, которая ставится на весь сайт. Хорошо бы проверить конфигурацию PHP касательно сессий. А вообще посмотрел бы в ответе сервера, что конкретно там происходит - скорее всего, эта кука попадает не туда.

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

3.
header("Content-Type: application/octet-stream"); // чтобы не выводилось текстом
readfile($filepath); // выводим файл
12.10.2007 в 09:36

Я не бог, я так низко не опускаюсь.
Или content-type подбирать соответствующий типу файла, чтобы картинки показались в браузере. а не скачивались и т.д.
12.10.2007 в 10:32

L.P.M. По умолчанию, сессия определяется кукой PHPSESSID, которая ставится на весь сайт.
Проверяю так - var_dump($_SESSION) на самом сайте - всё норм, при var_dump($_SESSION) вызываемый из файла в другой директории (причем переход по ссылке туда) возвращает NULL , причем сессию даже регенерировать пытался.. буду копаться с настройками

L.P.M. lugavchik
Огромное спасибо)
12.10.2007 в 13:18

Если Вы хотите избежать так называемого «хотлинкинга» – прямых ссылок на Ваши ресурсы с других сайтов – Вам опять-таки поможет .htaccess в комбинации с mod_rewrite.
Для начала рассмотрим, чем плох хотлинкинг. Например, некий сайт размещает у себя изображение, находящееся на Вашем сайте, просто указав его в тэге . При этом все обращения к такой странице вызовут скачивание данного изображения с Вашего сайта; таким образом, будет расходоваться Ваш траффик и пропускная способность канала сервера, а посетители чужого веб-сайта увидят изображение, хранящееся у Вас, без соответствующего контекста.

Как же бороться с подобной практикой?
Рассмотрим следующий пример части файла .htaccess:
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC] RewriteRule \.(js|css)$ - [F]
Данный код запрещает обращения к .js и .css файлам (скрипты Javasсript и описания Cascading Style Sheets), если они производятся не с Вашего сайта.

Другой пример:
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC] RewriteRule \.(png|gif|jpg|jpeg)$ www.mydomain.com/youaretheworst.gif [R,L]
При обращении извне к изображениям, хранящимся на вашем сайте, вместо самих изображений будет отображаться содержимое файла youaretheworst.gif.
12.10.2007 в 18:25

 
Проверяю так - var_dump($_SESSION) на самом сайте - всё норм, при var_dump($_SESSION) вызываемый из файла в другой директории (причем переход по ссылке туда) возвращает NULL , причем сессию даже регенерировать пытался.. буду копаться с настройками
session_start()-то не забыл? *) а то у меня так бывает)
а поставь Оперу, зайди через нее на сайт, а потом в Preferences > Advanced > coоkies > Manage coоkies, найди нужную куку и посмотри, куда она поставилась.
13.10.2007 в 08:06

L.P.M.
настройками session_start()-то не забыл? *) а то у меня так бывает)
нет конечно, в обоих скриптах стояло...
Preferences > Advanced > coоkies > Manage coоkies,
вау) вот чего мне всегда не хватало! спасиб)
13.10.2007 в 10:16

Всё будет Кока-Кола.
Ой....
Вот пример Миме:

image/jpeg
image/gif
image/png

это картинки и т.д.

Осет аппликатион заставит скачивать фай как бинарный документ.
13.10.2007 в 10:16

Всё будет Кока-Кола.
Не буду писать про защиту от скачивания, лень, там помудрите с хцессами, вроде процесс уже описали, а на выдачу:
1) узнайте миме тип файла

header('content-type:'.$mime);
echo($file_content);
exit(); //!!!!!

Для узнавания миме типа есть функция, не знаю какая правда, ибо пользуюсь своей личной. Поищите в доках.
13.10.2007 в 10:28

Волчонок Джей
спасиб, так и сделаю)
13.10.2007 в 16:57

 
ru2.php.net/manual/ru/function.mime-content-typ...
Вот тут нашлась функция для определения mime-type, но написано, что она deprecated...

Осет аппликатион заставит скачивать фай как бинарный документ.
Нет, application/octet-stream означает, что веб-сервер "не узнал" mimetype документа и предлагает распознать его клиенту самостоятельно.
А для скачивания можно попробовать application/x-msdownload, хотя доки говорят, что под этим должны подразумеваться исполнительные файлы)
13.10.2007 в 17:02

 
P.S. В свое время Апач "не узнавал" rar-архивы, отдавая их с application/octet-stream, в результате ряд браузеров пытался их открыть как текстовые файлы %) Потому я не доверяю встроенным функциям определения типа %) Такое до сих пор периодически наблюдается, например, на ifolder'е.
Кстати, для картинок еще можно использовать getimagesize() - там в возвращаемом массиве есть и mime-type.
14.10.2007 в 00:01

Never Say Never (c)
Посмотри ещё
php.su/articles/?cat=examples&page=018
php.su/forum/topic.php?forum=35&topic=11
webmastak.com/article.aspx?id=322
Там по поводу докачки сказано =)
14.10.2007 в 12:50

Всё будет Кока-Кола.
L.P.M. одно и тоже, если открыть такой файл в отдельно окне в ИЕ выше 5 и других браузерах пойдёт закачка. Вообщ самый просто способ написать такую функцию самому. Определять по расширению, это не так уж и сложно, не думаю что у вас будет много разных типов.

Расширенная форма

Редактировать

Подписаться на новые комментарии