Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ftp , bezpieczny download
Forum PHP.pl > Forum > Przedszkole
slepy
aarambo.gif Siema all aarambo.gif
Mam server ftp, chcialbym tam wzucic kilka gier itp.
Pierwszym moim ruszem bylo zrobienie okna ktore sie "ukrywa" poprzez meta wlacza sciaganie i po 10 sec samo sie wylacza.. Ale nie zawsze to sciaganie sie zdazylo wlaczyc a juz www sie zamykalo, dlatego pomyslalem ze zrobie to w php..
Oto torche zrodla:
  1. <?php
  2. $ftp_server=&#092;"ip\";
  3. $ftp_user_name=&#092;"login\";
  4. $ftp_user_pass=&#092;"haslo\";
  5.  
  6. $conn_id = ftp_connect($ftp_server); 
  7. $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 
  8. if ((!$conn_id) || (!$login_result)) { 
  9.  echo &#092;"Połączenie FTP się nie powiodło!\";
  10. die; 
  11.  } else {
  12.  echo &#092;"Połączony z serverem\";
  13.  }
  14. ?>

I co teraz musze zrobic zeby pobieranie pliku wlaczylo sie u uzytkownika? jest w ogole taka mozliwosc ? bo ftp_get pobiera mi plik na server z www ;/
Z gory THx za pomoc;)
Ludvik
php działa po stronie serwera, a nie klienta. Ostatecznie możesz przekierować klienta przy pomocy nagłówków, ale jeżeli chcesz ich użyć, to raczej nie napiszesz użytkownikowi, czy się dostał czy nie. Nagłówki muszą zostać wysłane przed jakimkolwiek innym wyjściem.

Kod z manuala.
  1. <?php
  2. header(&#092;"Location: http://www.example.com/\"); /* Przekieruj przeglądarkę */
  3. exit;  /* Upewnij się, że kod poniżej nie zostanie wykonany 
  4.  po przekierowaniu. */
  5. ?>


Funkcje ftp_ służą, do połączenia serwera, na którym stoi php z obiektem docelowym, który podajesz jako argument. W twoim przypadku nie zadziałają tak jak zamierzałeś.
slepy
No to w jaki sposob mozna zrobic bezpieczny download?
bo Header przepieruje awiec otworzy w moim przypadku: ftp://login:pass@ip/plik
i wszystko widac w naglowku... a mi chodzi o zabezpieczenie, zeby sciaganie pliku sie wlaczylo, ale zeby nikt nie wiedzial zkad...
Ludvik
Nie zrobisz tego tak prosto, bo kiedy klient ma ściągać przez przeglądarke, to musi dostać komplet danych, w tym linka, login i hasło. Tutaj jest największy problem. Nie wiem jak by to miało wyglądać, ale jeżeli ftp i http są na osobnych maszynach, to chyba ciężko będzie. Może, ktoś z większym doświadczeniem się wypowie?
squid
i co w koncu jak rzwiazales problem? bo przydazyl mi sie podobny
Vengeance
dac odpowiedni header() {spis mime-type macie przyklejony na subforum 'php'} polaczyc sie z ftp serwerem pobrac jakos ten plik do zawartosci jednej zmiennej a nastepnie wyslac go userowi przez zwykle echo.

cos analiogicznego do tworzenia obrazkow w php.
slepy
A ja bym to zrobił tak...
  1. <?php
  2. $link=&#092;"ftp://login:pass@ip/sciezka/plik.exe\";
  3. header(&#092;"Content-Type: application/force-download\");
  4. header(&#092;"Content-Type: application/octet-stream\");
  5. header(&#092;"Content-Type: application/download\");
  6. header(&#092;"Content-Disposition: attachment; filename=\".basename($link).\";\");
  7. header(&#092;"Accept-Ranges: bytes\");
  8. header(&#092;"Content-Transfer-Encoding: binary\");
  9. header(&#092;"Content=Lenght: \".filesize($link));
  10. readfile($link);
  11. exit();
  12.  
  13. ?>
  14. <html>
  15.  
  16. <head>
  17. <meta http-equiv=Content-Type content=text/html; charset=windows-1250>
  18. <title>DZIEKI ZA SCIAGNIECIE </title>
  19. <meta name=GENERATOR content=Microsoft FrontPage 3.0>
  20. </head>
  21. <body>
  22. <p>DZIEKI ZA SCIAGNIECIE !!</p>
  23. </body>
  24. </html>


Powinno działać.. już tego dokładnie nie pamiętam.
Wystarczy to ulepszyć i będzie ok smile.gif Pozdrawiam
squid
Cytat(slepy @ 2004-12-01 14:41:56)
A ja bym to zrobił tak...
  1. <?php
  2. $link=&#092;"ftp://login:pass@ip/sciezka/plik.exe\";
  3. header(&#092;"Content-Type: application/force-download\");
  4. header(&#092;"Content-Type: application/octet-stream\");
  5. header(&#092;"Content-Type: application/download\");
  6. header(&#092;"Content-Disposition: attachment; filename=\".basename($link).\";\");
  7. header(&#092;"Accept-Ranges: bytes\");
  8. header(&#092;"Content-Transfer-Encoding: binary\");
  9. header(&#092;"Content=Lenght: \".filesize($link));
  10. readfile($link);
  11. exit();
  12.  
  13. ?>
  14. <html>
  15.  
  16. <head>
  17. <meta http-equiv=Content-Type content=text/html; charset=windows-1250>
  18. <title>DZIEKI ZA SCIAGNIECIE </title>
  19. <meta name=GENERATOR content=Microsoft FrontPage 3.0>
  20. </head>
  21. <body>
  22. <p>DZIEKI ZA SCIAGNIECIE !!</p>
  23. </body>
  24. </html>


Powinno działać.. już tego dokładnie nie pamiętam.
Wystarczy to ulepszyć i będzie ok smile.gif Pozdrawiam

i user widzi twoje haslo

troche mija sie to z celem
rogrog
Cytat(squid @ 2004-12-01 18:28:11)
i user widzi twoje haslo

troche mija sie to z celem

User nie zobaczy hasła, jedynie nazwę pliku który udostępnia to ściąganie.

ja bym zrobił mniej więcej tak jak slepy tylko bez (chyba) niepotrzebnych dodatków i tego html (wygenerowany we frontpage, błeee...), który i tak się nie wyświetli bo jest po exit()


Wpisujesz pliki jakie masz do tablicy $pliki, po czym jeśli chcesz udostępnić jakiś plik dajesz link w postaci download.php?plik=plik1

  1. <?php
  2.  
  3.  
  4. //lista dopuszczalnych wartości
  5. $pliki = Array();
  6. $pliki['plik1'] = 'plik1.rar';
  7. $pliki['drugi_plik'] = 'plik1.zip';
  8. $pliki['pliknumertrzy'] = 'plik3.tar.gz';
  9.  
  10. //stworzenie ścieżki do pliku
  11. $dir = 'ftp://login:pass@ip/sciezka/';
  12. $filename = ( isset( $pliki[$_GET['plik']] ) ) ? $pliki[$_GET['plik']] : '';
  13. $pathfile = $dir.'/'.$filename;
  14.  
  15. //jeśli znaleziono taki plik w tablicy
  16. if ( $filename )
  17. {
  18. //wysłanie nagłówków zmuszających przeglądarkę do uruchomienia pobierania
  19. header('Content-Type: application/octet-stream');
  20. header('Content-Disposition: attachment; filename='.$filename);
  21. header('Content-Type: application/force-download');
  22. //odczytanie pliku z serwera FTP i wysłanie do przeglądarki
  23. readfile($pathfile);
  24. }
  25.  
  26. ?>
gdaq
Odgrzebuje temat bo przejrzalem 27 stron postow na forum i nie znalazlem odpowiedzi na swoj problem, a mysle ze temat jest wart rozwiazania bo jak widac nie jestem jedynym ktory nie moze sobie z tym poradzic:) Dobra do rzeczy.
Powyzsze skrypty sa jak najbardziej wporzadku ale moga sluzyc tylko i wylacznie do download'u poprzez http. Po wpisaniu protokolu "ftp://" w adresie URL pliku funkcje readfile,file_put_contents etc. spowoduja tylko wyslanie pliku przez protokol ftp do server'a http a uzytkownik otrzyma go przez http.

Znalazlem rozwiazanie w postaci header("Location") ale wowczas klient dostaje pelen paiet danych czyli login, haslo,host oraz katalog w ktorym znajduje sie plik. Jesli ograniczyc by sie tylko do IE poniekad problem rozwiazany bo ta przegladarka nie pokazuje owych danych jesli wywolamy download w powyzszy sposob, ale jest zenujacym poprostu:) ograniczac sie do najgorszego produktu na rynku;)

Kolejny pomysl jaki przyszedl mi do glowy to stworzyc tymczasowy katalog na serverze ftp do ktorego bedziemy przegywac pliki z ktalogu macierzystego zgodnie z rzadaniem uzytkownikow zakodowane powiedzmy uzywajac md5 a po sciagnieciu usuwac.

Ostatnie rozwiazanie pewnie najlepsze ale i najtrudniejsze:) Napisac program w C ktory wywolany z php'a wysle plik uzytkownikowi i tutaj czekam na propozycje:)

Co o tym myslicie? Moze ktos cos takiego juz robil wie jaksie do tego zabrac badz poda chociarz jakis link? Jakich bibliotek i funkcji uzywac jesli zdecydowalbym sie na napisanie czegos w C?

Gdaq
squid
Cytat(gdaq @ 2005-02-16 23:53:04)
Odgrzebuje temat bo przejrzalem 27 stron postow na forum i nie znalazlem odpowiedzi na swoj problem, a mysle ze temat jest wart rozwiazania bo jak widac nie jestem jedynym ktory nie moze sobie z tym poradzic:) Dobra do rzeczy.
Powyzsze skrypty sa jak najbardziej wporzadku ale moga sluzyc tylko i wylacznie do download'u poprzez http. Po wpisaniu protokolu "ftp://" w adresie URL pliku funkcje readfile,file_put_contents etc. spowoduja tylko wyslanie pliku przez protokol ftp do server'a http a uzytkownik otrzyma go przez http.

Znalazlem rozwiazanie w postaci header("Location") ale wowczas klient dostaje pelen paiet danych czyli login, haslo,host oraz katalog w ktorym znajduje sie plik. Jesli ograniczyc by sie tylko do IE poniekad problem rozwiazany bo ta przegladarka nie pokazuje owych danych jesli wywolamy download w powyzszy sposob, ale jest zenujacym poprostu:) ograniczac sie do najgorszego produktu na rynku;)

Kolejny pomysl jaki przyszedl mi do glowy to stworzyc tymczasowy katalog na serverze ftp do ktorego bedziemy przegywac pliki z ktalogu macierzystego zgodnie z rzadaniem uzytkownikow zakodowane powiedzmy uzywajac md5 a po sciagnieciu usuwac.

Ostatnie rozwiazanie pewnie najlepsze ale i najtrudniejsze:) Napisac program w C ktory wywolany z php'a wysle plik uzytkownikowi i tutaj czekam na propozycje:)

Co o tym myslicie? Moze ktos cos takiego juz robil wie jaksie do tego zabrac badz poda chociarz jakis link? Jakich bibliotek i funkcji uzywac jesli zdecydowalbym sie na napisanie czegos w C?

Gdaq

do kopiowania pliku nie potrzebujesz C, mozesz uzyc php i przekopiowac plik z katalogu ukrytego do publicznego ftp i podac pprostu userowi linka, jak go kliknie to sam menadzer downloadu mu sie uruchomi.
Nie rozumiem do czego chcesz uzyc md5 ale chyba niezgodnie z przeznaczeniem bo md5 nie jest f-cja kodujaca ale jednokierunkowa f-cja skrutu ktora z dowolnej tresci/pliku tworzy w maire unikalny ciag 128 bitow ale dla tej samej wiadomosci zawsze ten sam co jest uzywane do testow integralnosci.

mozesz sprobowac dodawac nowe hasla dostepu do ftp ktore daja dostep tylko do okreslonego katalogu
smile.gif
gdaq
C zamierzalem uzyc do jakby wlasnego server'a ftp ktory bedzie laczyc sie na wezwanie php'a z prawdziwym ftp'em. Podawal link do pliku ale defakto sciagal go przez mojego ftp'a ktoy dzialalby na jakims innym porcie i maskowal adres ftp w ten sposob.

MD5
zapisuje login do tablicy charow mieszam wszystkie znaki przypadkowo i generuje z tego md5 dostaje unikatowa nazwe. Tworze katalog w katalogu tmp o tej wlasnei nazwie. Wykluczam wlasciwie prawodpodobienstwo przypadkowego odnalezienia katalgou przez uzytkownika choc watpie zeby ktos chcial probowac jak zobaczy nazwe ftp://download/#@krzaczki@#/file.exe katalogowi download nadajemy chmod 771 a #@krzaczki@# chmod 775 co daje nam brak mozliwosci przegladania katalogow znajdujach sie w ktalagou download

Dodawanie kont do ftp'a jest chyba troszke malo wydajne i niebezpieczen bo w pewnym momencie bedziemy mieli np. 10 tys. kont na ftpie z czego uzywanych bedzie tylko 1 tys.

Nie chce mi sie wierzyc ze to jest takie skaplikowane do wykonania nie da sie tego jakims porostym sposobem rozwiazac.

Powracajajc jeszcze do funckji readfile etc. mam taki skrypcik:

  1. <?php
  2. header(&#092;"Pragma: public\");
  3. header(&#092;"Expires: 0\");
  4. header(&#092;"Cache-Control: must-revalidate, post-check=0, pre-check=0\");
  5. header(&#092;"Cache-Control: public\"); 
  6. header(&#092;"Content-Description: File Transfer\");
  7. header('Content-Type: application/octet-stream');
  8. header('Content-Disposition: attachment; filename='.$filename);
  9. header('Content-Type: application/force-download');
  10. header(&#092;"Content-Transfer-Encoding: binary\");
  11. header(&#092;"Content-Length: \".filesize($filename));
  12. readfile($pathfile);
  13.  
  14. ?>


Tylko ze sciaga wtedy np 255 bajtow np. z 8 MB. Czyli laczy sie z serwerem po przejrzeniu logow wnioskuje ze wynika to z tego iz jesli wywolam readfile lacze sie z serwerem przy uzyciu active mode a nie pasive moze o to chodzi. Ponizej zapis logow z servwera dla udanego download'u przy uzyciu header("Location") i nie udanego przy uzyciu readfile()

Kod
2005-02-16 09:27:06#majkel#00:00:13#8887179#0#8887179#1#0#634798,500#8#0
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > connected to ip : 192.168.0.228
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > sending welcome message.
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > 220 BulletProof FTP Server ready ...
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > USER anonymous
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > 331 Password required for anonymous.
(000007) 2005-02-16 09:27:06 - (not logged in) (192.168.0.218) > PASS ********
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > logged in.
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > 230 User majkel logged in.
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > TYPE I
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > 200 Type set to I.
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > PASV
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > 227 Entering Passive Mode (192,168,0,228,102,45).
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > SIZE /pcmark2002.exe
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > 213 8887179
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > RETR /pcmark2002.exe
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > asked to download 'C:\apache\htdocs\pcmark2002.exe' --> Access allowed.
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > 150 Data connection accepted from 192.168.0.218:1186; transfer starting for pcmark2002.exe (8887179 bytes).
(000007) 2005-02-16 09:27:06 - majkel (192.168.0.218) > started downloading 'C:\apache\htdocs\pcmark2002.exe'.
(000007) 2005-02-16 09:27:13 - majkel (192.168.0.218) > finished downloading 'C:\apache\htdocs\pcmark2002.exe' -  (00:00:08 - 8678,886 KB - 1084,861 KBytes/s)
(000007) 2005-02-16 09:27:13 - majkel (192.168.0.218) > 226 Transfer ok
(000007) 2005-02-16 09:27:19 - majkel (192.168.0.218) > disconnected. (00:00:13)

2005-02-17 14:03:08#majkel#00:00:00#0#0#0#0#0#0,000#0#0
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > connected to ip : 192.168.0.228
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > sending welcome message.
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > 220 BulletProof FTP Server ready ...
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > USER anonymous
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > 331 Password required for anonymous.
(000006) 2005-02-17 14:03:08 - (not logged in) (192.168.0.228) > PASS ********
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > logged in.
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > 230 User majkel logged in.
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > TYPE I
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > 200 Type set to I.
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > SIZE /ftp/pcmark2002.exe
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > 550 No such file or directory.
(000006) 2005-02-17 14:03:08 - majkel (192.168.0.228) > disconnected. (00:00:00)

Nie wiem wsumie co jest zapisywane na dysku bo z tego co powyzej wynika ze nic nie zostalo sciagniety w drugim przypadku z server'a
Czekam na jakies sugestie i propozycje:)

Gdaq
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.