Forum Webscript.Ru
Программирование => PHP => Тема начата: new_coder от 23 Января 2007, 12:43:18
-
Такая задача.
1. есть файл на сервере.
2. есть набор клиентов (достоверно определяемые по email)
Необходимо выдовать временные пароли и ссылки на скачивание.
Подскажите общие принцыпы!
1. как на сервере хранить файл что б доступ был только с временных ссылок? (доступна только папка htdocs)
2. как создаются временные ссылки?
3. когда производть аутентификацию по паролю?
-
new_coder
Совет номер ноль: поищи по форуму, уже много-много раз обсуждали.
3. Авторизацию проводищь когда тебе удобно. Главное, чтобы при запросе файла ты мог определить кто пользователь, собссно, такой. Session cookie для этого подходит.
2. Временные ссылки создаются случайным образом и заносятся в базу, в записи: идентификатор, время создания ссылки, файл оригинала, пользователь (если нужен).
Когда пользователь обращается за файлом, он так или иначе должен передать идентификатор временной ссылки твоему скрипту.
Что делает скрипт: смотрит, есть ли у него в базе такая ссылка, не истекло ли время, какие-то другие параметры. Если всё хорошо - отдает файл.
1. В папке с файлами положить .htaccess с чем-то вроде Deny from all. Тогда доступ будет только из твоих скриптов.
Неплохо бы еще заморочиться с content-range (чтобы пользователь мог "докачивать" файл), но это следующий этап.
-
спасибо
(поиском конечно пользовался)
-
такой вариант кода:
$HTML_Content = "
Сервер обновлений
";
if(isset($_GET[\'id\']) && isset($_GET[\'name\']))
{
$pass = CutBack($_GET[\'id\']);
$name = CutBack($_GET[\'name\']);
if( !($pass == \'\') && (!$name == \'\'))
{
$str = \'SELECT * FROM testload WHERE pass = \\\'\'.md5($pass).\'\\\'\';
$sql_sel_res = mysql_query($str);
if(!$sql_sel_res === false)
{
$res_sel = mysql_fetch_array($sql_sel_res,MYSQL_ASSOC);
if($res_sel[\'user_id\'] === $name)
{
$str = \'UPDATE testload SET count = count - 1 WHERE user_id = \\\'\'.$res_sel[\'user_id\'].\'\\\'\';
$sql_upd_res = mysql_query($str);
if($res_sel[\'count\'] < 1)
{
$str = \'DELETE FROM testload WHERE user_id = \\\'\'.$res_sel[\'user_id\'].\'\\\'\';
mysql_query($str);
}
$path = \'sait\\update\\\';
if(!file_exists($path.$res_sel[\'file\']))
{
$HTML_Content.=\'Файла нет\';
}
$hfile = fopen($path.$res_sel[\'file\'],"rb");
if($hfile === false)
{
$HTML_Content.=\'Файл не открылся\';
}
else
{
header("Content-Type: application/force-download\\r\\n");
header("Content-Transfer-Encoding: binary\\r\\n");
header("Content-Length: ".filesize($path.$res_sel[\'file\']));
header("Content-Disposition: attachment; filename=".$res_sel[\'file\']."\\r\\n");
readfile($path.$res_sel[\'file\']);
die("скачал");
}
}
else
{
$HTML_Content.="Данные неверные";
}
}
else
{
$HTML_Content.="Пароль неверный";
}
}
}
else
{
$HTML_Content.="нет данных";
}
$HTML_Content.="";
echo $HTML_Content;
ваше мнение?
-
new_coder
1. Запрос может отработать (true) но не вернуть значений. if(mysql_num_rows=1)
2. И где здесь временные ссылки? Я вижу только счетчик допустимого количества скачиваний файла для пользователя. Хотя возможно для твоей задачи большего и не надо.
-
по мелочам:
- обязательно надо проверять результаты, не было ли ошибок при выполнении запросов (особенно Insert, Delete).
- для проверки доступности файла - лучше is_readable
- убери die("скачал"); иначе это слово тоже попадет в файл клиенту :)
-
Макс
* die не попадет, у него content-length правильно дописывается
-
CGVictor
да, был не прав
-
временная ссылка это линк на этот скрипт
вроде: _http://download.php?name=\'123\'&pass=\'7sdfv90bv80v0sv9\'
или обычно это что-то другое?
-
new_coder
* Передавать пароль get-ом не слишком правильно.
Это обычно host.tld/script?7283afd02138ff80eba12832.
"7283afd02138ff80eba12832" - идентификатор, указание которого уже не требует ни пароля, ни логина, но он 1) длинный и сложный:) 2) устаревающий
-
т.е. ссылка заводиться не для конкретного пользователя а одна для всех на определенный срок?
или генерируется вместе с паролем для конкретного пользователя?
-
new_coder
А как проще. Вообще, конечно, лучше требовать авторизации в системе, но многие не заморачиваются - скажем, 30-символьный id подделывать нецелесобразно.