Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: uploadu plików
Forum PHP.pl > Forum > PHP
Cezar708
Mam problem

Musze uploadowac pliki, poprzez formularz html, do katalogu, ktory jest dostepny po wpisaniu "z palca" z paska adresu.

Chodzi o to aby haker nie zuploadowal sobie jakiegos pliku w stylu usune_wszystko.php tongue.gif i pozniej go po prostu nie wykonal.

Dodam ze musze uploadowac bardzo duzo typow plikow (nie tylko graficzne) i nie za bardzo wchodzi w rachube filtrowanie ich po MIME.

Jak wy robicie takie zabezpieczenia?... dodajecie header, czy jak?


pozdrawiam.
crash
  1. <?php
  2. if( substr( $_FILES[ 'plik' ][ 'name' ], -3) == 'php' )
  3. {
  4.  echo 'Wgrywasz plik *.php. Nieładnie :-P';
  5. }
  6. else
  7. {
  8.  // ...
  9. }
  10. ?>
Cezar708
no dobrze, ale czy czasem nie ma innych plikow wykonywalnych?
np takie jak php3, php4

Wiem ze zalezy to od serwera, ale w moim przypadku to bedzie uzywane na wielu serwerach, wiec nie moge za kazdym razem sprawdzac jakie pliki beda wykonywalnymi. Poza tym nie moge zaufac temu ze haker sam w jakis sobie znany sposob zmieni typy wykonywalnych plikow.
NuLL
Można tak
  1. <?php
  2. $_parts=explode('.',$_FILES[ 'plik' ][ 'name' ]);
  3. if( eregi($_parts[count($_parts)-1],'php' )
  4. {
  5.  echo 'Wgrywasz plik *.php. Nieładnie :-P';
  6. }
  7. else
  8. {
  9.  // ...
  10. }
  11. ?>
crash
Czasem wypadałoby też trochę ruszyć główką tongue.gif

  1. <?php
  2. $zabronione = array( 'php', 'php4', 'php5' );
  3.  
  4. $rozszerzenie = explode( '.', $_FILES[ 'plik' ][ 'name' ] );
  5. $rozszerzenie = array_shift( $rozszerzenie );
  6.  
  7. if( in_array( $rozszerzenie, $zabronione ) )
  8. {
  9.    echo 'Wgrywasz zabroniony typ pliku. Nieładnie :-P';
  10. }
  11. else
  12. {
  13.    // ...
  14. }
  15. ?>
Cezar708
ochh!

Ale ja pytam o przypadku, kiedy NIE WIEM, jakie typy plikow na danym serwerze sa wykonywalne. Tu *.php3 i *.php4 podalem tylko jako przyklad.

przeciez w przyszlosci moze sie na przyklad zdazyc ze moze stac sie wykonywalnym na przyklad plik *.php5.. a jeszcze pozniej *.php6... tylko nie pisz ze mozna tak:

  1. <?php
  2.  
  3. $rozszerzenie = explode( '.', $_FILES[ 'plik' ][ 'name' ] );
  4. $rozszerzenie = array_shift( $rozszerzenie );
  5.  
  6. for ( $i=1; $i<10000000; $i++)
  7. {
  8.    if ( $rozszerzenie == &#092;"php\".$i )
  9.   {
  10.      echo 'Wgrywasz zabroniony typ pliku. Nieładnie :-P';
  11.   }
  12. }
  13. else
  14. {
  15.    // ...
  16. }
  17. ?>


tongue.gif
Pigula
Cytat(Cezar708 @ 2005-07-05 18:04:00)
przeciez w przyszlosci moze sie na przyklad zdazyc ze moze stac sie wykonywalnym na przyklad plik *.php5.. a jeszcze pozniej *.php6...

to wtedy porpwaisz swoj skrypt a co do plikow wykonywanyc na serwerze to mozesz sprawdzic w ustawieniach lub zapytac sie admin i jak np. wykonywany bedzie plik *.inny to to rozszerzenie dajesz do tablicy rozszerzen zabronionych smile.gif
dr_bonzo
1. autoryzacja dostepu do formularza uploadu
2. uploadujesz do katalogu do ktorego niue dostaniesz sie poprzez wpisanie adresu w przegladarce
legorek
Ja to rozwiązałem jeszcze inaczej, w pliku .htaccess mam

Kod
AddType application/x-httpd-php-source php
AddType application/x-httpd-php-source php3
AddType application/x-httpd-php-source php4
AddType application/x-httpd-php-source phtml


itd.
Cezar708
no to jeszcze raz...

1. Musze uploadowac do katalogu ktory mozna napisac 'z palca' bo inaczej nie mialbym problemu, bo coz za problem skoro plik sie nie ma szans wykonac.

2. Chce ominac ciagla poprawianie kodu co jakis czas, poniewaz nie bede mial do nich pozniej dostepu

3. Dostep do formularza jest niestety publiczny i taki musi pozostac

4. Nie wiem na jakich serwerach w przyszlosci te skrypty beda dzialaly, wiec tez nie wiem z gory jakie pliki, beda wykonywalne

5. Nie moge tez na stale wpisac wszystkich mozliwych rozszerzen do jakiejs tablicy, bo to bylaby zbyt dluga i zmudna robota


Idealne byloby umieszczenie jakiegos naglowka w pliku, ale nie wiem jak to zrobic dla roznych typow plikow. Oczywiscie mile widziane bylyby alternatywne rozwiazania.


... dlatego ciagle szukam ... POMOŻECE?questionmark.gifquestionmark.gif?
crash
No to napawdę, sprawdzaj typ MIME, bo poza tym niemasz zbyt dużych możliwości, bo jak admin ustawi dozwolone rozszerzenie php na np. run to co? No ale z drugiej strony, jak by takie rzeczy miał odgadywać ewentualny hacker?
hawk
Cytat
1. Musze uploadowac do katalogu ktory mozna napisac 'z palca' bo inaczej nie mialbym problemu, bo coz za problem skoro plik sie nie ma szans wykonac.

Właściwie to dlaczego musisz? IMHO wcale nie musisz. Możesz przecież zrobić skrypt, który przepuści zawartość pliku z tego katalogu na przeglądarkę. Nie widzę żadnego powodu, dla którego musisz trzymać się tego rozwiązania. No ale jeżeli naprawdę musisz napisać skrypt, który ma poważną dziurę w bezpieczeństwie (czyli: ktoś ci każe), to nie twoja wina.
Pedros
A jak zrobić coś podobnego...(chodzi dokładniej rzecz biorąc o możliwość wgrania tylko i wyłącznie plików: plików archiwów - zip, rar, itp, plików exe i graficznych - jpegi, png, gif) przy pomocy mime types. Pamietam, że gdzies to kiedyś widziałem, ale opcja szukaj nie daje mi pozytywnych rezultatów... prosze o pomoc
crash
Za pomocą samych typów mime tego nie zrobisz bo zip, rar, php itp mają taki sam. Użyj tego co przedstawiliśmy wyżej + tablica z dozwolonymi typami porównywana z $_FILES[ 'plik' ][ 'type' ]...
Pedros
No niby wystarczyłoby tak zrobić(tylko od drugiej strony... dozwolonych formatów jest mniej smile.gif )

  1. <?php 
  2. $dozwolone = array(&#092;"gif\",\"jpg\",\"jpeg\",\"png\",\"zip\",\"rar\",\"gz\",\"exe\");
  3. $rozszerzenie = explode( '.', $_FILES[ 'plik' ][ 'name' ] );
  4. $rozszerzenie = array_shift( $rozszerzenie );
  5.  
  6. if( in_array( $rozszerzenie, $zabronione ) )
  7. {
  8.  ....
  9. }
  10. else
  11. {
  12. echo 'Wgrywasz zabroniony typ pliku. Nieładnie :-P';
  13. }
  14. ?>

Pojawia się tylko jeden problem.... W zasadzie można zmienić rozszerzenie pliku i wgrać go na serwer. Nie wiem jak to technicznie wygląda, ale żeby później się nie okazało, że jakaś przeglądarka sprawdzi mime i uruchomi skrypt php... dlatego przydałoby się chyba połączenie tego i sprawdzania mimów, a to nie wiem jak zrobić(i jakie mime mają te rozszerzenia smile.gif )...
mike
Cytat(Pedros @ 2005-07-24 11:04:26)
(...) sprawdzania mimów, a to nie wiem jak zrobić

1. mime_content_type()
2. Ostrożnie z tym. Taki shIEt badzIEwie potrafi zmienić typ mime pliku. Kiedyś pisałem system uploadu obrazków, który się rozbił o ta "przeglądarke" ponieważ nie przesyłała plików .jpeg z poprawnym typem mime.

Cytat(Pedros @ 2005-07-24 11:04:26)
(...) (i jakie mime mają te rozszerzenia smile.gif )...

Kiedyś na forum był topic ze spisem typów mime, ale został usunięty (nie wiem z jakich powodów, może był za stary). Bardzo długo go szukałem zanim się o tym zorientowałem.

Podziękowac należy Google za to że nadal mamy do niego dostęp:
forum.php.pl: Spis typów mime Cached by Google
sobstel
Cytat(mike_mech @ 2005-07-24 11:38:15)
Kiedyś na forum był topic ze spisem typów mime, ale został usunięty (nie wiem z jakich powodów, może był za stary). Bardzo długo go szukałem zanim się o tym zorientowałem. Podziękowac należy Google za to że nadal mamy do niego dostęp:
forum.php.pl: Spis typów mime Cached by Google

tu jest chyba nawet troszke wiecej :
http://www.webmaster-toolkit.com/mime-types.shtml
Pedros
No .... jestem już prawie na ukończeniu.
Ale pojawił się pewien problem... nie wiem czy wszyscy popełniliście błąd(lub jedna osoba popełniła, a reszta nie zauważyła) czy mój serwer jest upośledzony.... ale:

mam sobie nazwę pliku costam.zip

po wgraniu tego przez formularz zaczynam sprawdzać, czy rozszerzenie jest ok... i tu pojawiają się jaja smile.gif

po takim kawałku kodu z:
  1. <?php $rozszerzenie=explode('.', $_FILES['file']['name']);
  2. $rozszerzenie=array_shift($rozszerzenie);?>


i wyświetleniu $rozszerzenie, przeglądarka pokazuje mi: costam
i teraz kwestia do rozwiązania... czy to możliwe? skoro niby funkcja array_shift" title="Zobacz w manualu PHP" target="_manual usuwa z początku tablicy smile.gif))
sobstel
czytaj uwaznie manuala : "array_shift() usuwa pierwszą wartość parametru tablica i zwraca go skracając tą tablicę o jeden element" , czyli w twoim przypadku w $rozsrzenie bedzie siedziec ten pierwszy element. to czego szukasz to raczej array_pop" title="Zobacz w manualu PHP" target="_manual
Pedros
w takim razie dzięki za pomoc...
dla mnie słowo USUWA jest jednoznaczne... jak coś jest usunięte, to tego nie ma smile.gif) ale widać tłumacz manuala inaczej to zrozumiał :/

PS: teraz przynajmniej wiadomo, że to crashu pisząc kod się walnął winksmiley.jpg
sobstel
Cytat(Pedros @ 2005-07-24 19:25:14)
dla mnie słowo USUWA jest jednoznaczne... jak coś jest usunięte, to tego nie ma smile.gif)

uwazam ze w manualu jest to bardzo jasno napisane. i masz racje, wartosc ta jest usuwana z tablicy!!! ale zeby juz nie przedluzac tego dyskursu przenalizuj sobie ponizszy kod :

  1. <pre>
  2. <?php
  3.  
  4. $arr = array('val1','val2','val3','val4','val5');
  5. echo 'arr_before = '.var_export($arr,true);
  6.  
  7. $first = array_shift($arr);
  8.  
  9. echo 'first = '.var_export($first,true).&#092;"nn\";
  10. echo arr_after = &#092;".var_export($arr,true);
  11. ?>
  12. </pre>


wynik :

Kod
arr_before = array (
 0 => 'val1',
 1 => 'val2',
 2 => 'val3',
 3 => 'val4',
 4 => 'val5',
)

first = 'val1'

arr_after = array (
 0 => 'val2',
 1 => 'val3',
 2 => 'val4',
 3 => 'val5',
)
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.