Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]Zabezpieczenie pobierania plików
Forum PHP.pl > Forum > Przedszkole
Raptor1
Próbuje zrobić skrypt, który po podaniu właściwego kodu pobiera plik *.wav z serwera ftp zabezpieczonego hasłem. Poniżej przedstawiam kod:
  1. <?php
  2. $plik = $_REQUEST['plik'];
  3. $kod = $_REQUEST['kod'];
  4. $conn = mysql_connect('localhost', 'xxxx', 'xxxx');
  5. mysql_select_db('xxxx', $conn);
  6. $sql = "select count(*) from kod where text_kod = '$kod'";
  7.  
  8. $wprowadz = "
  9.            <form action='download.php' method='post'>
  10.                If you want to download it write kode
  11.                <input type='text' name='kod'>
  12.                <input type='submit' name='sprawdz' value='Send'>
  13.            </form>
  14.        
  15.        ";
  16. if ( $kod != '' )
  17.    {
  18.        list($wiersz) = mysql_fetch_row(mysql_query($sql, $conn));
  19.        if ($wiersz == 1)
  20.            {
  21.                echo "<head><meta http-equiv='refresh' content='0; url=ftp://login:hasło@ścieżka/katalog/$plik'></head>";
  22.            }
  23.            else
  24.            {
  25.                echo $wprowadz;
  26.            }
  27.    }
  28.    else
  29.    {
  30.        echo $wprowadz;
  31.    }
  32. ?>


Oczywiście po uruchomieniu nie pozwala na pobranie pliku a jedynie na odsłuchanie go. Mi chodzi jednak żeby była możliwość pobrania. Próbowałem już z

  1. <?php
  2. header('Content-Disposition: attachment; filename="plik.wav"');
  3. ?>


Ale plik ten jest na ftp z hasłem a poza tym w tym przypadku nie bardzo jest możliwość podania ścieżki.
Może ktoś już się spotkał z tym problemem i ma sprawdzone rozwiązanie ewentualnie jakąś podpowiedź.
bregovic
Zdajesz sobie sprawę z tego ze twój kod zdradza każdemu hasło i imię użytkownika do FTP? Jeśli na prawdę musisz używać FTP, zerknij na ftp" title="Zobacz w manualu PHP" target="_manual... Ale FYI, łatwiej będzie jeśli masz te pliki gdzieś na twoim serwerze, i użyjesz PHP do wysyłania ich do użytkowników, wtedy nie będziesz miał problemu z Content-Disposition itp... Pozatym, przefiltruj twoje zmienne:
  1. <?php
  2. $kod = mysql_real_escape_string(trim($_REQUEST['kod']));
  3. ?>
-Raptor1-
Dzięki za odpowiedź. Co do wystawiania loginu i hasła do ftp to to był tylko przykład i zdaje sobię sprawę że tak nie powinno być. Myślałem dziś trochę nad tym i zastanawiam się czy dobrym pomysłem by było użycie curl do stworzenia tymczasowego pliku i dopiero wystawienie go przez php. Jak mi zadziała to wystawie kod dla potomności lub ewentualnej krytyki smile.gif
pozdrawiam
bim2
echo file_get_contents("ftp://login:hasło@ścieżka/katalog/$plik");
bregovic
Ok, w takim razie zerknij na readfile" title="Zobacz w manualu PHP" target="_manual. Nie wiem jak chcesz użyć do tego curl'a, ale brzmi to trochę nazbyt zaawansowanie w stosunku do problemu - al trudno sie wypowiedzieć bez kodu winksmiley.jpg
-Raptor1-
Macie racje chyba wystarczy
  1. <?php
  2. ?>
dzięki wielkie za podpowiedzi wieczorkiem potestuje.
-Raptor1-
Zrobiłem coś takiego Działa ale nie do końca i nie wiem czemu.
W jednym pliku
  1. <?php
  2. $Plik_download = "ftp://login:hasło@ścieżka/plik.wav";
  3. $filepath = "temp/test.wav";
  4. $filename = "test.wav";
  5. copy($Plik_download, $filepath);
  6. echo "<head><meta http-equiv='refresh' content='0; url=temp/download2.php?plik_tmp=$filename'></head>";
  7. ?>

W drugim pliku
  1. <?php
  2. $Plik_temp = $_REQUEST['plik_tmp'];
  3. header("Content-Disposition: attachment; filename='$Plik_temp'");
  4. ?>

i teraz tak plik mi się pobiera z ftp zapisuje w katalogu temp pod nazwą test.wav wyskakuje okienko do zapisu pliku zapisuje ale jakby nie pobierał strumienia danych z pliku. Zapisuje mi się jako plik test.wav ale zawsze ma 20 B czyli pokrótce jest pusty sadsmiley02.gif
Może wiecie co może być przyczyną ?
Pozdrawiam
bregovic
Tjah, ale w drugim pliku nic nie wysyłasz przecierz? readfile? No i pozatym, poczytaj o header i nagłówku Location. Strasznie koszmarkowo to wygląda...
-Raptor1-
Nom wiem że najlepszego kodu to ja nie pisze sad.gif Ale mam nadzieje że z czasem mi minie ta ułomność. Dzięki za odpowiedź poczytam popróbuje i napisze jak mi zadziała smile.gif
-Raptor1-
Wreszcie się udało poczytałem obaczyłem przykłady i już wiem co trzeba było zrobić poniżej kod:
  1. <?php
  2. // przesyłana nazwa pliku
  3.  
  4. $Plik_temp = $_REQUEST['plik_tmp'];
  5.  
  6. // nagłówki
  7.  
  8. header("Content-Disposition: attachment; filename=$Plik_temp");
  9. header('Content-Type: application/x-unknown');
  10.  
  11. // pobranie pliku (plik znajduje się w tym samym katalogu co skrypt)
  12.  
  13. if ($fp = fopen($Plik_temp, 'rb'))
  14.    {
  15.        flock($fp, 1);
  16.        echo(fread($fp, filesize($Plik_temp)));
  17.        flock($fp, 3);
  18.        fclose($fp);
  19.    }
  20. ?>


Dzięki za podpowiedzi pozdrawiam
bregovic
Możesz to jeszcze uprościć:
  1. <?php
  2. // Nazwa pliku
  3. $file = $_REQUEST['plik_tmp'];
  4.  
  5. // Nazwij plik na systemie docelowym
  6. header('Content-Disposition: attachment; filename="'.$file.'"');
  7.  
  8. // Lepiej jest mieć właściwy typ zawartośći...
  9. header('Content-Type: application/x-unknown');
  10.  
  11. // Sprawdzamy czy plik istnieje
  12. if (is_file($file)) {
  13.    
  14.    // Rozmiar pliku
  15.    header('Content-Length: '.filesize($file));
  16.    
  17.    // Zwróć zawartość pliku do przeglądarki
  18.    readfile($file);
  19. }
  20. ?>
gox
Zasadnicze pytanie, to czy mozesz utworzyc konto FTP bez prawa do usuwania plikow..
Bo jesli tak to nie ma sensu Dublowac sobie transferu.
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.