Forum Webscript.Ru
Программирование => PHP => Тема начата: Helios от 13 Августа 2002, 00:45:25
-
Можно ли как нибудь организовать (необязательно на PHP) скачивание файлов с запароленного FTP сервака, чтобы при этом нигде не отображались логин и пароль от этого сервака. (Anymous доступ к серваку невозможен).
Заранее большое спасибо!
-
Смотри ftp-functions в мануале.
-
с запароленного FTP сервака, чтобы при этом нигде не отображались логин и пароль от этого сервака
как ты себе это представляешь ?
-
В каком Мануале (К чему Мануале?)?
-
TO Макс:
Я себе это не могу представить, поэтому и спрашиваю...
-
В каком Мануале
Вот в этом
http://www.php.net/manual/en/ref.ftp.php
К чему Мануале?
К PHP функциям работающими с ftp.
-
Я себе это не могу представить, поэтому и спрашиваю...
Если сервак запаролленый, то к нему без логина/пароля подключиться нельзя (кроме взлома сервака ).
Поэтому логин или пароль должны быть известны скрипту. Либо прямо указаны в переменных либо должны вводится пользователем при запуске скрипта
-
TO Макс:
Я логин и пароль знаю и хочу, чтобы они "были известны" только скрипту и скрыты от пользователя.
-
Helios
Так впиши его в скрипт - и никому его (скрипт) не показывай.
Тебе все равно придется их указывать в явном виде при подключении
Опять же - внимательно читаем мануал.
-
и скрыты от пользователя.
а скрипт будет выдаваться пользователю? (в смысле исходники будут доступны пользователю?). Если да - то безопасность обеспечить ИМХО почти нельзя (можно как-то спрятать логин/пароль но профи смогут его найти).
-
Макс
Как они будут доступны?
Твои исходники доступны пользователю?
-
ThE0ReTiC
Я просто не пойму что он хочет. Если исходники не доступны, то почему он так переживает.
Твои исходники доступны пользователю?
Я уж думал что он какой-то скрипт делает свободным для скачивания, который будет соединятся с FTP и скачивать от туда файлы и поскольку исходники открыты он боится за логин/пароль к FTP
-
Попробую все объяснить сначала и подробно:
Есть FTP сервер (места неограничено и вообще не никаких ограничений), доступ к которому возможен только по паролю и логину (Anymous доступа нету). Вот я на этот сервер скинул пару песенок и хочу чтобы они стали доступны для посетителей сайта. А для этого я хочу написать (достать, спросить) скрипт, который бы позволял посетителям сайта скачивать эти песни, однако чтобы "явным образом" не было видно пароля (чтобы была минимальная защита от дураков).
To ThE0ReTiC и Макс:
Вся проблема заключается в НАПИСАНИИ такого скрипта. Не подскажете, а еще лучше напишите такой скрипт, плиз. (А я на сайте ссылочку повешу, что "Этот скрипт написал (А дальше ник и e-mail, того кто помог")
-
Helios
а доступа к содержимому FTP-сервера через HTTP нету?
Насчет скрипта, то пароли можешь смело прописывать в скрипте
-
Доступа через http нету, вообще из всех вариантов доступа есть только парольный ftp.
Пароли буду в скрипте прописывать, только его сначала сочинить надо.
-
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
die;
} else {
echo "Connected to $ftp_server, for user $ftp_user_name";
}
// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
// check upload status
if (!$upload) {
echo "FTP upload has failed!";
} else {
echo "Uploaded $source_file to $ftp_server as $destination_file";
}
// close the FTP stream
ftp_close($conn_id);
?>
Чем этот скрипт (вернее пример из мануала) не устраивает?
-
Дмитрий Попов
Это закачка на сервер, дарагой.
Для отдачи файлов пользвателям этот скрипт надо обработать напильником.
:):):)
Helios
В скрипте пиши и не мучайся. СОчинить не сложно - мануал посмотри.
Могу дать класс для работы с FTP (правда он немного не дописан, он нужные тебе функции там есть)
-
ThE0ReTiC
Ууупс... Саавсем паверхнастна пасматрел, да?. :-))
Хорошо, мы тут эту строчку заменим:
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
На эту:
$upload = ftp_get ( $conn_id, $local_file, $remote_file, FTP_BINARY);
Helios:
Это действительно просто. Скрипт перед Вами... осталось чуть-чуть передел
-
Дмитрий Попов
[OFF]Если бы я поверхностно посмотрел - то ничего бы не написал.
Я ж сказал - обработать напильником, что ты и сделал[/OFF]
-
ThE0ReTiC
Дай, плиз, клас для работы с FTP. А вось разберусь?
Дмитрий Попов
Я видел этот пример в мануале, однако $local_file надо в каком виде указывать (просто название.расширение или полный путь куда должно записываться, типа c:/название.расширение), и переменную $remote_file надо как указывать (полный путь к файлу, допустим /pub/files/название.расширение)? И еще вопрос: что из себя представляет процесс скачивания таким образом файла (Просто будет втихаря полчаса работать браузер, пока будет скачиваться файл, или эту файл "подхватит" и начнет скачивать GetRight (ReGet и т.д.))?
-
Ненавижу вопросы, которые задаются даже без малейшей попытки подумать перед этим своей головой.
-
ThE0ReTiC
А чем хороштвой класс?
-
Доктор
Да ничем. я его просто так сделал - ради тренировки
-
Доктор
Я просто абсолютно не знаю, как работает FTP с PHP (даже в Мануале я не нашел подробного описания), и с принципом работы FTP я знаком только на уровне "выгрузки файлов на сервер".
-
ThE0ReTiC
Я имел ввиду, что я посмотрел поверхностно (Вы меня не так поняли:-D)
Helios
Причем тут C:// ?
Вы на сервер сохраняете файл, а потом просто отдаете его в браузер fread\'ом.
Чего-то мне кажется Вы вообще PHP почти не изучали...
-
Дмитрий Попов
PHP я изучал (правильнее сказать "изучаю").
А вот Файловые операции в PHP действительно почти не изучал, да и опыта практического мало...
А Вы не могли по подробнее написать, что должен fread в данном случае делать?
-
Helios
fread
Вообще-то считывает определенное количество байт из файла.
Немного не понимаю, каким боком он здесь затесялся, особенно если учесть, что считанная информация передается в переменную.
Если надо напрямую в броузер, то не проще ли воспользоваться readfile ?
-
ПОЖАЛУЙСТА ПОМОГИТЕ!
Скажите же, что надо после $upload = ftp_get ( $conn_id, $local_file, $remote_file, FTP_BINARY); делать?
-
Helios
Header("Content-Type: ...");
readfile($local_file);
Типа того.
COntent-Type пропишешь в зависимости от типа отдаваемого файла (архив, кино, картинка, etc...)
-
А если реально подумать, то какая же чепуха это все. Сколько этот файл, если он хоть немного приличных размеров, будет качаться по ftp сначала... ни один юзер не выдержит...
-
ThE0ReTiC
Это... ошибся, не ту функцию дал (извуняюсь... с кем не бывает). Конечно я имел ввиду readfile...
Доктор
Это уже другой вопрос...
Можно делать хитро (как opensource.net, правда они с другой целью) - ставить сессию, где человек выбирает какой-то бред, и начинается сессия... Пока человек выбирает, файл начинает скачиваться... Когда выбрал - надпись
"Вы должны подождать 10 минут. Это сделано с целью..." а дальше впаривать доверчивого юзера...:-D
Кто обяъснит Гелиосу как это делать? :-)))
Helios
То, что я написал выше - шутка, конечно... А над словами Доктора задумайтесь...
-
Я думаю, если файл будет 5, 10, а то 100МБ (точнее 103МБ) десятью минутами дело не ограничется...
-
Похоже придется давать ссылку посетителям сайта вместе с логином и паролем, надеясь на их порядочность...
-
А анонимный доступ организовать не проще?
-
ThE0ReTiC
Один знакомый попросил своего знакомого, работающего в известной хостинг компании, организовать по дружбе неограниченное пространство. Он организовал неограниченное простарнство, однако, чтобы не получить себе проблемы, он смог организовать только парольный доступ. По его словам все бы сразу обнаружили "левый" ftp доступ.
Вот такая грустная история...
-
Helios
Конечно обнаружили бы...
Warez?
-
Ладно, поприкалывались, и хватит.
Смотрим мануал:
int fopen (string filename, string mode [, int use_include_path])
If filename begins with "ftp://" (not case sensitive), an ftp connection to the specified server is opened and a pointer to the requested file is returned. If the server does not support passive mode ftp, this will fail. You can open files for either reading or writing via ftp (but not both simultaneously).
Скрипт get_ftp_file.php. Как параметр для вызова filename (т.е. ссылка прописывается так: скачать картиночки ;))
Пишем такой код для этого файла:
$f=fopen("ftp://$ftp_username:$ftp_password@needed.domen.com/path/$filename", "r");
if (! $f) {
echo "Incorrect file name or server does not support passive mode ftp";
exit;
}
// Тип файла $content_type в общем случае нужно
// определить либо из расширения запрашеваемого
// файла $filename, либо по таблице соответствия,
// которую составить, включив в нее всенаши файлы,
// доступные для скачивания
// Пока так:
$content_type="application/zip";
header("Content-Type: $content_type");
// Content-Length я вообще не уверен, что надо
// обязательно выдавать, а проверять влом, но,
// если выдавать, то тут тоже есть 2 пути:
// 1. Тоже таблица, составленная для всех наших файлов.
// 2. Лучшие и универсальнее узнать с помощью ftp_size
// (перед которой, естесственно ftp_connect, и ftp_quit после)
// Пока так, как будто знаем:
$content_length=26454;
header("Content-Length: $content_length");
set_time_limit (0);
while (!feof ($f)) {
$buffer = fread($f, 4096);
echo $buffer;
flush();
}
fclose($f);
?>
Теоретически должно работать.
-
ThE0ReTiC
Да никакой не Warez. Просто видеоклипы и mp3 нескольких групп.
Доктор
Ты гений! ВСЕ ЗАРАБОТАЛО! Огромное тебе спасибо! На странице, с этими ссылками у себя на сайте повешу тебе благодарность!
Однако все-же есть две мелочи:
1) Нельзя ли как нибудь сделать, что-бы Download\'ер (GetRight в моем случае) сразу в качестве имени сохраняемого файла ставил реальное имя файла, а не имя и расширение скрипта.
2 (Крупная мелочь)) Нельзя ли как-нибудь сделать возможной докачку файлов? (Все же как-то не очень удобно за один раз скачать 10 -12 МБ)
И еще:
А где можно узнать, какому расширению соответствует какой Content-Type?
-
1) Попробуй выдать такие заголовки:
Там, где Content-Type, добавить имя файла через точку с запятой, хотя не знаю обязательно ли, а экспериментировать самому лень:
header("Content-Type: $content_type;name=$filename");
А также еще один заголовок:
header("Content-Disposition: attachment; filename=$filename");
Не уверен, обязательно ли слово attachment, может быть можно просто:
header("Content-Disposition: filename=$filename");
Причем опять же, может быть, что достаточно одного из этих заголовков, надо бы было просто поэкспериментировать с разными браузерами и качалками.
2) Дозакачка вообще сложный вопрос. Как я понимаю, специально для этого придуман заголовок Content-Range:
header("Content-Range: $start-$end/$size");
Интересно, как узнать от клиента этот $start...
То-есть, может быть, что-то и можно было бы придумать, но сильно геморно... А ведь некоторые качалки еще по частям качают...
Не стоит мучаться.
3) MIME-типы можно посмотреть, например, у Апача в файле mime.types
-
Доктор
А нет ли где-нибудь подробного описания всех существующих "заголовков"?
-
Доктор
А что означает переменная $end в заголовке Content-Range.
-
Описания всех существующих заголовков у меня нет.
$start и $end - по идее номера первого и последнего байтов текущего куска относительно всего файла.
-
То есть $start всегда равна 1 (единице), а $end равна размеру скаченного пользователем куска?
-
Нет, по идее $start=размер_скачанного_ранее_куска+1, а $end=размер_текущего_куска.
А вообще я ж говорю: забудь и не заморачивайся.
С именем получилось хоть?
-
Helios
Есть конечно.
Поищи в RFC архивах
-
Люди вопрос на засыпку! А с помощью mod_rewrite эту проблему не решеть? Вот идея: все запросы к файлам в папке /files, будут переписываться на ftp сервер.
Пример:
Было - site.ru/files/music.mp3
Стало - frp://логин::пароль@ftp_site.ru/music.mp3
По идеи всё нормально будет(не проверял), но наверное в качалке юзера "пролезет" настоящее имя файла. Если я не прав поправьте :)
-
Tronyx
frp://логин::пароль@ftp_site.ru/music.mp3
так логин и пароль будут открытыми.
-
ThE0ReTiC
Что такое "RFC архивы"?
Доктор
Да, с именем получилось:
header("Content-Type: $content_type;name=$filename");
header("Content-Disposition: attachment; filename=$filename");
Правда я еще не пробовал убирать attachment; и name=$filename");
-
Tronyx
Или это вообще не будет работать, так как ftp-сервер и http-сервер физически находятся в разных местах
Helios
RFC - это описание стандартов. http://www.rfc-editor.org
-
Helios
A RFC архивы - это сборник стандартов...
Класная весчь Яньдекькс. Попользуйся, коли тебе интересно.
-
Или это вообще не будет работать, так как ftp-сервер и http-сервер физически находятся в разных местах
А это паралельно.
-
А еще MIME-типы можно смотреть в типах файлов в виндозе.
-
Tronyx
Вся эта заморочка и нужна-то была только для того, чтобы спрятать от подлого юзера логин с паролем...
-
Tronyx
Вся эта заморочка и нужна-то была только для того, чтобы спрятать от подлого юзера логин с паролем...
А вот что написал я:
но наверное в качалке юзера "пролезет" настоящее имя файла
Если я не прав поправьте
-
Кстати о докачке, пример есть в faq-е с ru.php
Лежит на faq.saterenko.ru
-
Макс
http://faq.saterenko.ru/index18.html
Оно?
-
Доктор и Макс
Огоромное Вам двоим спасибо! На основе скрипта Доктора и ссылки, данной Максом, получился скрипт скачивающий с FTP и поддерживающий докачку! Ваши имена и mail\'ы через недельку-другую будут с благодарностью вывешены на http://www.moderntalking.org/mp3.php!
Если кому надо, вот конечный вариант скрипта:
$filename = "pornuha_warez.zip";
$ftp_username = "login";
$ftp_password = "password";
$server = "pornuhaandhack.ru";
$content_length=51638;
$fd = @fopen("ftp://$ftp_username:$ftp_password@$server/$filename", "rb");
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
$range = $HTTP_SERVER_VARS["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if ($range) {fseek($fd, $range);}
}
$content = fread($fd, $content_length);
fclose($fd);
if ($range) {
header("HTTP/1.1 206 Partial Content");
}
else {
header("HTTP/1.1 200 OK");
}
header("Content-Disposition: attachment; filename=$filename");
header("Accept-Ranges: bytes");
header("Content-Length: ".($content_length-$range));
header("Content-Range: bytes $range-".($content_length -1)."/".$content_length);
header("Content-type: application/octet-stream");
print $content;
exit;
?>
-
Оно?
Да, сам фижу, что оно. Все нормально и понятно. Только не понялвот этого:
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
$range = $HTTP_SERVER_VARS["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if ($range) {fseek($fd, $range);}
А конкретно почему:
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
Получается просто сливаем начало и конец диапазона?
bytes=1024-2048
Получается range=10242048
Или я не правильно понимаю что-то (например формата $HTTP_SERVER_VARS["HTTP_RANGE"])???