RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 466
от 22.09.2006, 17:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 364, Экспертов: 56
В номере:Вопросов: 1, Ответов: 1


Вопрос № 55661: Есть проблема. На сайте 3 группы пользователей: гости (абсолютно бесправны, могут только зарегистрироваться), зарегистрированные (имеют кое-какие возможности) и авторизованные (оплатившие доступ к основной информации). Авторизованные пользователи име...

Вопрос № 55.661
Есть проблема. На сайте 3 группы пользователей: гости (абсолютно бесправны, могут только зарегистрироваться), зарегистрированные (имеют кое-какие возможности) и авторизованные (оплатившие доступ к основной информации). Авторизованные пользователи имеют возможность скачивать некоторую информацию в виде zip-архивов. Переход на страницу ссылок возможен только для пользователей с соответствующими правами, это реализовано. Ссылки на архивы не должны быть прямыми (чтобы нельзя было ее кинуть товарищу). Я так понимаю, это можно реализовать модулем Apache mod_rewrite, но я с ним на "ВЫ" и хотелось сделать что-то попроще.
Найдено следующее решение (не претендую (пока :) ) на первооткрывателя, но еще нигде его не видел):
корень сайта: /home/user/public_html
был создан каталог /home/user/download (WEB-сервер доступа к нему, соответственно, не имеет). В него скинут архив, например, data.zip
В /home/user/public_html/.htaccess прописан путь:
php_value include_path .:/home/user/download
В /home/user/public_html создаю файл links.html, содержащий строку
<A href="/archive.zip?file=data" target="_blank">Какие-то данные</A>
и файл archive.zip (именно такой), следующего содержания:

<?php
if ($_SESSION['userauth'] != 'yes') {
header("Location: /");
exit;
}
header("Content-type: application/zip");
readfile($_GET['file'].'.zip',1);
?>

В /home/user/public_html/.htaccess задаю:
AddType application/x-httpd-php .zip

При щелчке на ссылке пользователь получает файл с именем archive.zip, являющийся, фактически, копией архива data.zip. Если ссылкой воспользуется неавторизованный пользователь, его просто отправит в "корень" сайта. Решение рабочее, проверено практикой.

Вопроса есть 2:
1. Нет ли у этого решения незамеченных мной проблем с безопаснотью?
2. Может есть способ более "правильный"?
Отправлен: 16.09.2006, 23:47
Вопрос задал: Rootikmaks (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Загиров Рустам
Здравствуйте, Rootikmaks!
Если в параметре $_GET['file'] можно указать любой архив. Можно кодировать функцией md5, создав массив с именами файлов и его хэшами(или в БД), чтобы каждый раз не читать список всех файлов и сверять с текущим MD5.
В дополнение можно указать имя архива в заголовке:
$file=$_GET['file'].'rar';
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($file).";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
---------
Этот мир обречён на нас
©Сергей Маврин
Ответ отправил: Загиров Рустам (статус: Практикант)
Ответ отправлен: 18.09.2006, 00:12
Оценка за ответ: 5
Комментарий оценки:
Здравствуйте, Рустам.
Хэшировать имена можно, но смысла не вижу - хотя сторонний человек и может задать известное ему имя в URL, но перед отправкой файла будет проверена его авторизация через механизм сессий и, если он не имеет нужных прав, то ничего не получит. Впрочем, как дополнительную меру защиты может и применю.
А за заголовки отдельное большое спасибо. Раньше все скачиваемые файлы имели одно имя - archive.zip. Не очень напрягало, но теперь все "как должно быть".


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное