Pobieranie plików mp4 z serwera

0

Znalazłem i nieco przerobiłem kod umożliwiający pobieranie plików z serwera, tak oto wygląda


<?php
 
ignore_user_abort(true);
set_time_limit(0); // disable the time limit for this script
 
$path = "C:/wamp/www/filmy/"; // change the path to fit your websites document structure
 
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).]|[\.]{2,})", '', $_GET['download_file']); // simple file name validation
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL); // Remove (more) invalid characters
$fullPath = $path.$dl_file;
 
if ($fd = fopen ($fullPath, "r")) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    header("Content-type: video/mp4");
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); 
    header("Content-length: $fsize");
    header("Cache-control: private"); //use this to open files directly
    while(!feof($fd)) {
        $buffer = fread($fd, 2048);
        echo $buffer;
    }
}
fclose ($fd);
exit;

?>

No i rzeczywiście plik się pobiera w całości(mp4), ale nie mogę go potem odtworzyć. Wyświetla mi się informacja, że "nie można zrenderować pliku". Nie pokazuje miniaturki. Nie wiem czym może być to spowodowane, pomożecie?

0

Zobacz pod hexedytorem czy wszystko się zgadza, tudzież wykonaj diffa pliku pobranego oraz oryginału.

0

preg_replace zapewne rzuca warning, bo pattern nie ma znaku początkowego/końcowego.

ogólnie zamień sobie

while(!feof($fd)) {
        $buffer = fread($fd, 2048);
        echo $buffer;
    }

na

while(!feof($fd)) {
die('--KONIEC');
    }

Następnie notatnikiem zobacz co masz w tym pliku mp4 (zapisze Ci się tylko fragment) - tam na 99% będzie treść ostrzeżenia

0

Zrobiłem jak zasugerowałeś jednak nie ma żadnego ostrzeżenia. Jest tylko w 3-cim wierszu napis : "--KONIEC".

0

A w poprzednich dwóch?

0

Dobra Panowie dzięki za dobre chęci, ale znalazłem już rozwiązanie. Oto gotowy kod jakby ktoś potrzebował

<?php
$file = 'C:/wamp/www/filmy/'.$_GET['download_file'];

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: video/mp4');
	header("Content-Transfer-Encoding: Binary");
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?> 
1

Piękne rozwiązanie pozwalające na shakowanie całego serwera szybciej niż pstryknięcie palcami, gratulacje

0

A możesz powiedzieć coś więcej? Ewentualnie jak to poprawić?

1

W parametrze download_file można podać dowolną ścieżkę, np. coś w stylu ../../bin/mysql/mysql.cfg, otrzymując zawartość tego pliku.

0

No tak, racja. Też o tym pomyślałem teraz. Ale o.k postawię sobie if'a i po problemie. Czy coś jeszcze przeoczyłem?

0

Zależy w jaki sposób postawisz tego ifa :P

0

Aczkolwiek wydaje mi się, że trochę za szybko mnie skrytykowaliście. Ktoś kto chciałby zhackować serwer miałby dostęp tylko do folderu "filmy" i ewentualnie jego podfolderów. W moim przypadku nic by w ten sposób nie uzyskał. Wszystkie ważne pliki są w folderze głównym.

1

W przypadku Twojego pierwszego kodu każdy, kto chciałby zhakować serwer, miałby dostęp do każdego folderu na Twoim filesystemie (plus minus ograniczenia wynikające z ACL czy też ścieżek skonfigurowanych w PHP).

0

Pierwszy tak, ale ten drugi nie.

0

Wrzuć ten drugi, może mówimy o czym innym :-P

1

No ale ten właśnie kod jest podatny...
Mówiłem Ci, że możesz sobie jako parametr ?download_file podać na przykład ../.htaccess i Ci to pobierze spoza katalogu filmy :-P

0

Czyli można cofnąć się o katalog wyżej? Jak dokładnie to się robi? Nie znam się zbyt dobrze dlatego pytam. PHP jedynie liznąłem.

0

Za pomocą ".." Możesz "przechodzić" po całej strukturze katalogów. Po prostu musisz zfiltrować parametr $_GET.

/(.(mp4))$/

lub inne wyrażenie reg.

Poczytaj nieco o filtrach/sanitizatorach w php - http://php.net/manual/en/book.filter.php

0

O.K rozumiem wszystko. Wstawię sobie if'a i po sprawie. Dzięki za informacje

1

@Mostek87
Pokaż tego ifa potem, bo można też zrobić dziurawy warunek.

0

Pokazuję już if'a ale jednocześnie mam inny problem. Kod nie działa dla plików większych niż około 200 MB. Tzn. przy dużych rozmiarach na początku jest przez jakieś 10 sekund "rozpoczynanie" a potem pobiera jakieś piśki typu 290 bajtów. Czy ktoś może wie dlaczego tak się dzieje?

Kod wygląda tak(u mnie można pobierać tylko pliki mp4) :

<?php
$file = 'filmy/'.$_GET['file'];

 if(strpos($file,'.mp4') == false)
 {
   echo'Na nic takie sztuczki cwaniaczku';
   exit;
 }
 
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: video/mp4');
    header("Content-Transfer-Encoding: Binary");
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>  

1 użytkowników online, w tym zalogowanych: 0, gości: 1