Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Upload plików
Forum PHP.pl > Forum > PHP
djpiatek
Witam smile.gif

Piszę stronę uploadu plików i oczywiście pobierania z niej plików i myślę aktualnie nad zabezpieczeniami. Na tą chwilę mam stworzony plik .htaccess:
  1. Options -Indexes
  2. Options -ExecCGI
  3. AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi


uploadować można wszystkie rozszerzenia - co proponujecie użyć aby było bezpiecznie ?smile.gif
kiler129
Najbezpieczniejszą opcją jest aby katalog z plikami leżał w drzewie o jeden stopień płycej niż htdocs. Wtedy nie dając userom bezpośredniego URL do plików mało, że możesz kontrolować 100% ich pobieranie to na dokładkę masz z głowy wszystkie skrypty.
Nie ma róży bez kolców - musisz napisać odpowiednio skrypt do downloadu.

p.s. Jeśli już zabezpieczasz htaccesem to nie rób dziwnych kombinacji jak wyłączanie cgi a następnie aktywowanie handlera cgi dla odpowiednich plików.
Może to spowodować w najlepszym wypadku HTTP/500 a w najgorszym aktywowanie cgi-exec (bo opcja addhandler może nadpisac -Exec* w niektórych konfiguracjach) co spowoduje wykonanie kodu.
Bezpieczniej jest dać je w odwrotnej kolejności chociaż to też nie daje 100% pewności.
Najlepsze byłoby serwowanie plików z osobnej subdomeny będącej vhostem nie posiadającym żadnego interpretera (czy to php czy cgi).
Możesz też użyć tricku służącego mi zanim nauczyłem się sposobu z drzewem lub z vhostem:
Kod
AddType text/html .php
piotr94
ja polecam ten katalog o poziom wyżej niż htdocs, u mnie się sprawdza takie rozwiązanie.
przeczytaj też:
http://forum.php.pl/index.php?showtopic=135788&hl=
djpiatek
Odpowiedni skrypt do downloadu co powinien zawierać ? myślałem nad
  1. header('Content-Disposition: attachment; filename=' . $nazwa);

piotr94
powinien zawierać cały szereg różnych funkcji, to co pokazałeś jak najbardziej tak,
przeczytaj dokładnie wszystko z linka, który CI podałem:
http://us2.php.net/manual/en/function.readfile.php
  1. <?php
  2. $file = 'monkey.gif';
  3.  
  4. if (file_exists($file)) {
  5. header('Content-Description: File Transfer');
  6. header('Content-Type: application/octet-stream');
  7. header('Content-Disposition: attachment; filename='.basename($file));
  8. header('Content-Transfer-Encoding: binary');
  9. header('Expires: 0');
  10. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  11. header('Pragma: public');
  12. header('Content-Length: ' . filesize($file));
  13. flush();
  14. readfile($file);
  15. }
  16. ?>
  17.  

uwżaj tylko na zapytania z ../ i innymi tego typu rzeczami. Najlepiej pliki indeksuj w db, do skryptu przekazuj tylko ID i potem cała reszta.
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.