Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] readfile() - brak uprawnień
Forum PHP.pl > Forum > PHP
yarek12
Witam,
Mam download plików przez readfile, oto kod pliku php który pobiera pliki:

  1. <?php
  2. $file = $_GET['file'];
  3. header('Content-Type: application/octet-stream');
  4. header('Content-Disposition: attachment; filename="'.$file.'"');
  5. readfile('../files/'.$file.'');
  6. ?>


Owszem plik pobiera się, nazwa się zgadza, tylko zawartość pliku zawsze jest taka:

  1. <br />
  2. <b>Warning</b>: readfile(../files/[136]_[test]_[300x300]_[b28b5c].txt) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: Permission denied in <b>xxxxxxxxxxxxxx/download.php</b> on line <b>5</b><br />
  3.  


Dodam, że na localhost pobieranie działa, pliki są pobierane a ich zawartość jest taka jak powinna być, nie ma żadnych błędów.

failed to open stream: Permission denied in - z błędu wynika że nie ma uprawnień do pobrania pliku, jednak każdy dodawany plik ma chmod 766.

Co więc może być nie tak?
gcdreak
  1. Spróbuj wyświetlić ścieżkę '../files/'.$file.'' i zwerfikuj ręcznie, czy skrypt ma uprawnienia
  2. Sprawdź uprawnienia folderu nadrzędnego dla skryptu
yarek12
jestem blady w tematyce po stronie serwera, więc jakbyś mógł jaśniej wytłumaczyć te 2 punkty, byłbym wdzięczny.
gcdreak
Cytat(gcdreak @ 7.07.2011, 21:11:58 ) *
Spróbuj wyświetlić ścieżkę '../files/'.$file.'' i zwerfikuj ręcznie, czy skrypt ma uprawnienia

Daj w skrypcie tylko
  1. echo '../files/'.$file.''; //To co masz w readfile()

Pozostałe linie zakomentuj. Potem, jak już będziesz miał tą wyświetloną ścieżkę do pliku sprawdź w kliencie FTP czy się zgadza i czy masz odpowiednie uprawnienia.

Cytat(gcdreak @ 7.07.2011, 21:11:58 ) *
Sprawdź uprawnienia folderu nadrzędnego dla skryptu

W kliencie FTP sprawdź, czy skrypt ma uprawnienia do katalogu zawierającego pliki.
by_ikar
Sprawdź co ta funkcja zwróci:

Kod
var_dump(fileperms('../files/[136]_[test]_[300x300]_[b28b5c].txt'));


BTW nie wystarczy że pliki mają uprawnienia, katalog z tymi plikami też musi ci zezwalać na odczyt. Umieszczaj operacje na plikach w warunkach is_readable | is_writable i tym podobne. Dzięki czemu wcześniej będziesz już wiedział w czym jest problem, zamiast doszukiwać się go gdzieś po plikach.
yarek12
Na serwerze zwraca int(33534)

Na localhost zwraca int(33206)

Przypominam że na localhost wszystko śmiga jak trzeba
by_ikar
Aj nie popatrzałem co zwraca funkcja, tylko na pałę ją podałem ;P zrób inaczej, sprawdź tak:

Kod
var_dump(substr(sprintf('%o', fileperms('../files/[136]_[test]_[300x300]_[b28b5c].txt')), -4));
pyro
Pragnę dodać, że w ten sposób można pobierać dowolne pliki z serwera. Zabezpiecz się.
yarek12
string(4) "0666" - na local host

string(4) "1376" - na serwerze
gac3k
No ta trójka znaczy mniej więcej tyle że zwykły użytkownik, czyli nie właściciel i nie root nie ma właściwie żadnych praw do operacji na danym pliku, zmień sobie chmod, za pomocą funkcji chmod('0644',$sciezka); o ile tylko serwer daje Ci takie prawa.
yarek12
chmod 0664 nic nie zmienił


dalej wyskakuje ten sam błąd co z chmodem 766
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.