Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z pobieraniem mp3 z serwera
Kiubus
post
Post #1





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


Witam.
Mam na swoim serwerze pliki w formacie MP3. Chciałbym, aby była możliwość ich pobrania. Próbowałem zrobić po prostu w HTML (a href...) ale to otwiera nowe okienko. Znalazłem na internecie skrypt download.php:
  1. <?php
  2. if (isset($_GET['file']) && substr($_GET['file'], -3)=='mp3') {
  3. header('Content-type: application/x-download');
  4. header('Content-Disposition: filename="'.$_GET['file'].'"');
  5. readfile($_GET['file'] );
  6. }
  7. ?>

Po jego użyciu nakazano stosować adres do hrefa w stylu:
  1. <a href="download.php?file=plik.mp3">

Ogólnie to działa, tylko, że na 4 linki pobiera tylko 1 piosenkę do odsłuchu, resztę ściąga rozmiarze np. 23 bajtów gdzie utwór ma rozmiar 2,29 MB. Czy ktoś może mi pomóc?
Pozdrawiam!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Generalnie uważałbym bardzo na ten skrypt - ma potencjalną lukę w bezpieczeństwie, ponieważ w żaden sposób nie filtrujesz danych wejściowych ($_GET['file']). Co będzie w przypadku, jeśli ktoś poda w nazwie pliku ../../../.htpasswd ?
Polecam Ci stworzyć jakiś mechanizm zabezpieczający dane na serwerze, a przede wszystkim filtrowanie danych wejściowych. Nie mam też pewności czy masz kompletne nagłówki czy nie powinno być mniej więcej coś takiego:
header ("Content-disposition: attachment; filename=".$file.";");
header("Content-Length: ".filesize($file));

oczywiście $file jest przefiltrowaną wcześniej lokalizacją pliku wraz z jego nazwą. Wycinałbym wszystkie znaki specjalne oraz zagrywki typu ../.. oraz ~ i /
Go to the top of the page
+Quote Post
Kiubus
post
Post #3





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


Wiem, ze skrypt moze byc dziurawy, ale niezbyt mam pomysl jak zrobic dobrze to pobieranie bo tak jak wspomnialem href mnie nie urzadza. Bez hrefa jest ciezko i zostaje tylko php i dlatego potrzebuje pomocy (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
by_ikar
post
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Jest podatny na atak directory traversal, najprościej można zabezpieczyć taki skrypt poprzez basename który zawsze zwróci tylko nazwę pliku, zamiast pełnej ścieżki, dzięki czemu nikt nie będzie mógł się "wydostać" poza katalog w którym będziesz miał pliki do pobrania. Bo w ten sposób można pobrać cały twój kod ze strony, łącznie z konfiguracją (np dostępem do bazy danych).

  1. <?php
  2.  
  3. if(isset($_GET['file']) && substr($_GET['file'], -3)=='mp3')
  4. {
  5. $file = basename($_GET['file']);
  6.  
  7. header('Content-Type: application/octet-stream');
  8. header('Content-Transfer-Encoding: Binary');
  9. header('Content-disposition: attachment; filename="'.$file.'"');
  10. header('Content-Length: '.filesize($file));
  11.  
  12. readfile($file);
  13. }
Go to the top of the page
+Quote Post
Kiubus
post
Post #5





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


Ok, dzięki za podpowiedź odnośnie zabezpieczeń. A co do mojego drugiego problemu macie jakąś radę? Na 4 linki pobiera tylko 1 piosenkę do odsłuchu, resztę ściąga rozmiarze np. 23 bajtów gdzie utwór ma rozmiar 2,29 MB. Czy ktoś może mi pomóc? Pliki nie są uszkodzone, bo normalnie działają, w całości zostały przesłane na serwer a jest jak jest ;/
Go to the top of the page
+Quote Post
by_ikar
post
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Jeżeli pobiera ci tylko niektóre pliki, to raczej już nie jest wina skryptu samego w sobie. Może te pliki są uszkodzone czy może połączenie ci zrywa - ciężko stwierdzić..
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Cytat(Kiubus @ 7.08.2014, 22:30:06 ) *
Na 4 linki pobiera tylko 1 piosenkę do odsłuchu, resztę ściąga rozmiarze np. 23 bajtów gdzie utwór ma rozmiar 2,29 MB.

Podejrzyj edytorem tekstu taki 23 bajtowy plik.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Obstawiam

"404/ File bla blabala.mp3 not found"
(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kiubus
post
Post #9





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


Cytat(by_ikar @ 8.08.2014, 11:19:35 ) *
Jeżeli pobiera ci tylko niektóre pliki, to raczej już nie jest wina skryptu samego w sobie. Może te pliki są uszkodzone czy może połączenie ci zrywa - ciężko stwierdzić..

Pliki działają, sprawdzałem je na komputerze przed wysłaniem. Wysyłałem każdy z osobna, żeby mieć pewność, że przesłały się całe - przesłały się całe a jest jak jest. Połączenia nie zrywa, bo tak już występuje u dwóch osób.

Cytat(trueblue @ 8.08.2014, 11:22:24 ) *
Podejrzyj edytorem tekstu taki 23 bajtowy plik.

Plik ma format MP3, w winampie ma długość 0:00, po otworzeniu Notepadem jest pusty.

Cytat(Pyton_000 @ 8.08.2014, 12:00:01 ) *
Obstawiam

"404/ File bla blabala.mp3 not found"
(IMG:style_emoticons/default/smile.gif)

Problem jest taki, że plik zostaje ściągnięty, ale tak jakby jego minimalna część. Jest to piosenka w formacie mp3 o wadze np. 2 MB, a pobiera 23 bajty.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Dodaj sobie przed head
  1. var_dump($_GET['file']);die();

i sprawdź czy istnieje taki plik w podanej ścieżce względem skryptu

Ten post edytował Pyton_000 8.08.2014, 13:13:10
Go to the top of the page
+Quote Post
Turson
post
Post #11





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


  1. var_dump($_GET['file']);die;

co mówi?

Ten post edytował Turson 8.08.2014, 13:14:12
Go to the top of the page
+Quote Post
Kiubus
post
Post #12





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


dodałem w pliku html przed <head> tą linijkę co pisaliście, ale nic nie zauważyłem na stronie.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


nie przed <head> tylko header('....
Go to the top of the page
+Quote Post
Kiubus
post
Post #14





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


po kliknięciu w link downloadu:
  1. string(10) "nazwapliku.mp3"
Go to the top of the page
+Quote Post
Pyton_000
post
Post #15





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


i czy na pewno masz taki plik dokładnie w tym samym miejscu w którym plik PHP ?
Go to the top of the page
+Quote Post
Kiubus
post
Post #16





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 11.10.2010

Ostrzeżenie: (0%)
-----


dokładnie tak, wszystkie pliki strony + mp3 i skrypt download.php są w jednym folderze.

@edit
Problem został rozwiązany. Gdyby kiedyś ktoś miał podobny problem, to z nazw pobieranych plików wystarczy usunąć polskie znaki i z hiperłącza również (IMG:style_emoticons/default/smile.gif) Dzięki wszystkim za pomoc!

Ten post edytował Kiubus 9.08.2014, 09:59:27
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.12.2025 - 14:23