Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Upload obrazków
Forum PHP.pl > Forum > Przedszkole
Maxik
Napisałem sobie skrypt uploadu obrazków, jeszcze go nie testowałem, ale mam pytanie. Czy jest on dostatecznie dobrze zabezpieczony?
  1. <?php
  2.  
  3. if(isset($_POST['send'])){
  4.    $typy = array('image/gif', 'image/jpeg', 'image/png', 'image/jpg');
  5.    if(!is_uploaded_file($_FILES['file'])){}
  6.        echo "Wybierz plik.";
  7.    } elseif(!in_array($_FILES['file']['type'], $typy, true)){
  8.        echo "Nie dozwolony format pliku!";
  9.        exit;
  10.    } elseif(getimagesize($_FILES['file']['tmp_name'])[0]<1 or getimagesize($_FILES['file']['tmp_name'])[1]<1)){
  11.        echo "Plik nie jest obrazkiem(minimalna wielkość 1px x 1px)";
  12.        exit;
  13.    } elseif($_FILES['file']['size']>256000){
  14.      echo "Plik ma zbyt duży rozmiar";
  15.    } else{
  16.        $check=false;    
  17.        while(!$check)    
  18.        $randed = array(
  19.        "r","h","k","y","4","p","q","w","n","2","8","a"
  20.        )
  21.        
  22.        $i = 0;
  23.        $kod = "";
  24.        while($i<=4){
  25.            $z = mt_rand(0,11);
  26.            $kod .= $randed[$z];
  27.        }
  28.        if(!file_exists('files/'.$kod.$_FILES['file']['name'])){
  29.        move_uploaded_file($_FILES['file']['tmp_name'], 'files/'.$kod.$_FILES['file']['name']);
  30.        $check=true;
  31.        } else{
  32.            continue;
  33.        }
  34.    }
  35. } else{
  36.    echo "Upload, dozwolone pliki: JPG, PNG, GIF<br />";
  37.    echo "<form action='".$SERVER['PHP_SELF']."' method='post' enctype='multipart/form-data'>";
  38.    echo "<input type='hidden' name='MAX_FILE_SIZE' value='256000' />";
  39.    echo "<input type='file' name='file' /><br />";
  40.    echo "<input type='submit' name='send' />";
  41.    echo "</form>";
  42. }
  43.  
  44. ?>


Miałem parę błędów, poprawiłem je, mimo wszystko uploaduje i za chwilę jest połączenie przerwane przez serwer. Co zrobiłem źle(błędy składni poprawiłem już)?
golaod
Ogólnie to parę błędów masz. np. co Ci daje pętla która tworzy cały czas tą samą tablice z tymi samymi danymi?
Sam kod jest zabezpieczony.
Pilsener
Kod jest nieczytelny, np.:
  1. <?php
  2. if(!is_uploaded_file($_FILES['file'])){}
  3.       echo "Wybierz plik.";
  4. ?>
- co ma robić ten if?

Oducz się używania echo - używaj zmiennych - i po co exit jak używasz tych ifów, elseifów itp? Utniesz stronę w środku? Pomieszanie z poplątaniem - można to o wiele prościej zrobić, metodologia powinna być mniej więcej taka:
  1. <?php
  2. if(!in_array($_FILES['file']['type'], $typy)){$error[] = 'Niedozwolony typ pliku';}
  3. if(){$error[] = 'coś tam';}
  4. ?>
- wszystkie błędy wrzucasz sobie np. do tablicy, a zanim np. zapiszesz plik na dysku sprawdzasz funkcją empty, czy tablica błędów jest pusta. Na samym końcu dopiero użyjesz echo - żeby wyświetlić błędy lub treść - dzięki temu masz kontrolę nad treścią i całość szybciej działa.

Co do sprawdzania:
- typ mime - ok
- rozmiar, rozdzielczość - ok
- zamiast unikatowej nazwy nadawaj po prostu numer kolejny, lub użyj microtime lub uniqid

Możesz jeszcze dla pewności użyć biblioteki GD - na forum były tematy, jak sprawdzić przy pomocy funkcji typu imagecopy, czy plik jest prawidłowym obrazkiem, dodać do niego znak wodny itp.
Maxik
Tak jak pisałem błędy poprawiłem, ten z niekończącą się pętlą też. Wkleję nowy kod:
  1. <?php
  2.  
  3. if(isset($_POST['send'])){
  4.    $typy = array('image/gif', 'image/jpeg', 'image/png', 'image/jpg');
  5.    $size = getimagesize($_FILES['file']['tmp_name']);
  6.    if(!is_uploaded_file($_FILES['file']['tmp_name'])){
  7.        echo "Wybierz plik.";
  8.    } elseif(!in_array($_FILES['file']['type'], $typy, true)){
  9.        echo "Nie dozwolony format pliku!";
  10.        exit;
  11.    } elseif($size[0]<1 or $size[1]<1){
  12.        echo "Plik nie jest obrazkiem(minimalna wielkość 1px x 1px)";
  13.        exit;
  14.    } elseif($_FILES['file']['size']>256000){
  15.      echo "Plik ma zbyt duży rozmiar";
  16.    } else{
  17.        $check=false;    
  18.        while(!$check)    
  19.        $randed = array(
  20.        "r","h","k","y","4","p","q","w","n","2","8","a"
  21.        );
  22.        
  23.        $i = 0;
  24.        $kod = "";
  25.        while($i<=4){
  26.            $z = mt_rand(0,11);
  27.            $kod .= $randed[$z];
  28.            $i++;
  29.        }
  30.        if(!file_exists('files/'.$kod.$_FILES['file']['name'])){
  31.         if(move_uploaded_file($_FILES['file']['tmp_name'], 'files/'.$kod.$_FILES['file']['name'])){
  32.             echo "Plik wrzucony!";
  33.         } else {
  34.             echo "Błąd.";
  35.         }
  36.        $check=true;
  37.        } else{
  38.            continue;
  39.        }
  40.    }
  41. } else{
  42.    echo "Upload, dozwolone pliki: JPG, PNG, GIF<br />";
  43.    echo "<form method='post' enctype='multipart/form-data'>";
  44.    echo "<input type='hidden' name='MAX_FILE_SIZE' value='256000' />";
  45.    echo "<input type='file' name='file' /><br />";
  46.    echo "<input type='submit' name='send' />";
  47.    echo "</form>";
  48. }
  49.  
  50. ?>


Echa i exity są tymczasowo, to miałby być sam silnik, layout w smarty. Gorzej, że gdy wybieram plik i wysyłam to nic się nie dzieje, a za chwilę mam "Połączenie przerwane przez serwer", na folder files nadałem chmod 777. Jakieś pomysły?

O matko. Coś ze mną nie tak, zamieniłem miejscami true i false i działa biggrin.gif Dzięki wszystkim.
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.