Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pierwszy skrypt w OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
SN@JPER^
Witam, mój pierwszy skrypt, klasa...

Dobrze załapałem póki co programowanie obiektowe? Jakie błędy robie? Co poprawić?

  1. class UploadFiles{
  2. private $file;
  3. private $dir;
  4. private $mime = array('image/jpeg', 'image/gif', 'image/png');
  5. private $chmod=777;
  6.  
  7. public function saveFile($fileName, $dir) {
  8. $this->file=$_FILES[$fileName];
  9. $this->dir=$dir.'/'.$this->file['name'];
  10.  
  11. if(isset($_FILES[$fileName])){
  12.  
  13. if($this->file['error']==0){
  14. if(is_uploaded_file($this->file['tmp_name'])){
  15. if(in_array($this->file['type'], $this->mime)){
  16. if(move_uploaded_file($this->file['tmp_name'], $this->dir)===true){
  17. chmod($this->dir, $this->chmod);
  18. return true;
  19. }
  20. }else{
  21. //Nieprawidłowy format pliku
  22. }
  23. }
  24. }else{
  25. switch($_FILES[$this->file]['error']){
  26. case 1: /* KOMUNIKAT o przekroczeniu wartości upload_max_filesize*/; break;
  27. case 2: /* KOMUNIKAT o przekroczeniu wartości max_filesize*/; break;
  28. case 3: /* KOMUNIKAT o wysłanym częściowo pliku*/; break;
  29. case 4: /* KOMUNIKAT o nie wysłaniu żadnego pliku*/; break;
  30. }
  31. }
  32. }else{
  33. return false;
  34. }
  35. }
  36.  
  37. }
Crozin
Źle...
1) Cały obiekt składa się wyłącznie z jednej metody, co za tym idzie nie ma sensu korzystać z pól/własności/składowych/jakkolwiek by tego nie nazwać klasy, skoro używane jest to jedynie w kontekście lokalnym
2) Takie sprawdzanie typu mime to o kant d..y rozbić można. _FILES[abc][type] jest ustawiane przez użytkownika, czyli może tam być cokolwiek
3) W PHP istnieją przedefiniowane stałe określające kod błędu
4) Masz takie coś jak wyjątki... dużo lepiej się sprawdza niż zwykłe true/false
5) Nazwa klasy też niezbyt dobrze trafiona.
darko
Dobrze jest, jak na pierwszy skrypt. Nie ma sensu usuwać pól, jak dojdzie jeszcze jakaś metoda, to wtedy się przydadzą. Z tą obsługą błędów to fakt, mógłbyś lepiej to rozwiązać. Właściwie mógłbyś zwracać rezultat move_uploaded_file, przynajmniej byłoby wiadomo czy uploadowano.
SN@JPER^
Będzie m.in metoda do nazw plików.

Cytat
2) Takie sprawdzanie typu mime to o kant d..y rozbić można. _FILES[abc][type] jest ustawiane przez użytkownika, czyli może tam być cokolwiek


Co proponujesz?
Crozin
Cytat
Co proponujesz?
Typ MIME wyciągnąć z pliku dopiero po stronie serwera - a potem (tj.: fragment z in_array()) już tak samo.
SN@JPER^
W takich typu klasach, lepiej użyć __construct czy tak jak w moim przypadku?

Cytat(Crozin @ 10.01.2010, 22:14:51 ) *
Typ MIME wyciągnąć z pliku dopiero po stronie serwera - a potem (tj.: fragment z in_array()) już tak samo.


Czyli po move_uploded_file sprawdzic mime? Jeżeli nie bedzie nieprawidłowy to co wtedy? usunać plik?
Crozin
Tak, jeżeli z plikiem jest coś nie tak to usuń go.
SN@JPER^
Próbuje użyć funkcji mime_content_type, ale coś nie działa...

na localhost default nie działa, musiałem odznaczyć ";" w extension=php_mime_magic.dll

Po odznaczeniu nic nie wyświetla.
marcio
TO sprawdzaj rozszerzenie i tyle.
zegarek84
Cytat(SN@JPER^ @ 10.01.2010, 23:45:05 ) *
Próbuje użyć funkcji mime_content_type, ale coś nie działa...

którą masz wersję php?? - czytaj może co piszą w manualu - te komunikaty:
mime_content_type - a dalej to masz link jakiej funkcji powinieneś użyć jeśli masz php 5.3
finfo_file
SN@JPER^
No to sie zgadza. mam wersje "PHP Version 5.2.5".

co do tego mime_type, wydaje sie jednak, że sprawdzanie rozszerzenia jest lepszym pomysłem. Co o tym sądzicie?

Troche mnie martwi fakt, ze najpeirw musi z uploadowac plik, sprawdzic mime, jeżeli sie nie zgadza to go usunac(!).

a i jeszcze "5) Nazwa klasy też niezbyt dobrze trafiona." - czemuż to?
marcio
Cytat
co do tego mime_type, wydaje sie jednak, że sprawdzanie rozszerzenia jest lepszym pomysłem. Co o tym sądzicie?

Troche mnie martwi fakt, ze najpeirw musi z uploadowac plik, sprawdzic mime, jeżeli sie nie zgadza to go usunac(!).


Bo jest to bardziej logiczne i szybsze tym bardziej ze sam sie juz kiedys przejechalem na sprawdzaniu mime plikow bo nie wiedzialem ze poprzez naglowki mozna je zmodyfikowac, i staje sie to "bezpieczne" dopiero wtedy gdy go sprawdzimy jak plik jest juz na srv.

SN@JPER^
a no chyba, że tak smile.gif
CapaciousCore
A nie lepiej recznie sprawdzac naglowek pliku?
SN@JPER^
Cytat
A nie lepiej recznie sprawdzac naglowek pliku?

Jak?

Dobra idea tego sprawdzania rozszerzenia?


  1. class Upload{
  2. private $dir;
  3. private $type = array('jpg', 'gif', 'png');
  4. private $chmod = 0777;
  5. private $file;
  6.  
  7. public function __construct($fileName, $dir){
  8. $this->file = $_FILES[$fileName];
  9. $this->dir = $dir;
  10.  
  11. if(isset($this->file)){
  12. $nameFile = $this->createTitle($this->file['name']);
  13. if(!file_exists($this->dir.'/'.$nameFile)){
  14. if(is_uploaded_file($this->file['tmp_name'])){
  15.  
  16. if(move_uploaded_file($this->file['tmp_name'], $this->dir.'/'.$nameFile)){
  17. chmod($this->dir.'/'.$this->file['name'], $this->chmod);
  18.  
  19. $d='';
  20.  
  21. $d = opendir($dir);
  22. while(false !== ($f = readdir($d))) {
  23. if($f == $this->file['name']){
  24. $ex = explode('.', $f);
  25. if(in_array($ex[1], $this->type)){
  26. //wgrano
  27. }else{
  28. if(unlink($this->dir.'/'.$this->file['name'])){
  29. echo 'Zły format pliku!';
  30. }
  31. }
  32. }
  33. }
  34. closedir($d);
  35. }
  36. }
  37. }else{
  38. echo 'Taki plik już istnieje!';
  39. }
  40. }
  41. }
  42.  
  43. private function createTitle($title){
  44. $title = strtolower($title);
  45. $title = str_replace(' ', $this->replacechar, $title);
  46. return $title;
  47. }
  48. }
Cysiaczek
Czy możesz napisać, co zamierzałeś zrobić, czyli po co Ci był potrzebny kod? Inaczej mówiąc - co kod miał robić (nie co robi teraz). Własnymi słowami.
SN@JPER^
Jak widać u góry dyskutowaliśmy jak sprawdzić rozszerzenie/mimetype. Wielu proponowało, aby sprawdzić rozszerzenie/mimetype po wgraniu pliku na serwer.

Dobrze to rozwiązałem?
Cysiaczek
Nie zrozumiałeś mnie smile.gif
Cytat
Witam, mój pierwszy skrypt, klasa...

Dobrze załapałem póki co programowanie obiektowe? Jakie błędy robie? Co poprawić?


Ja bym chciał, abyś opisał to, co myślałeś zanim zacząłeś pisać kod, który zaprezentowałeś wyżej, bo to istotne.
SN@JPER^
Prosty skrypt uploadu obrazów na serwer... Sprawdzanie rozszerzenie/mime etc.
phpion
  1. $ex = explode('.', $f);
  2.  
  3. if(in_array($ex[1], $this->type)){
  4. //wgrano
  5. }

Zabezpieczenie żadne. Przepuści np. plik moje_zdjecia_porno.jpg.exe.
darko
  1. private function _checkExtension($file) {
  2. $temp = pathinfo($file);
  3. return in_array(@strtolower($temp['extension']), $this->extensions);
  4. }

gdzie $this->extensions to tablica dozwolonych rozszerzeń, ale też zabezpieczenie żadne, bo wystarczy zmienić ręcznie rozszerzenie pliku i przejdzie.
blooregard
Jak już wspomniał @phpion, sprawdzanie rozszerzenia zda się psu na budę.
Podstawową kwestią jest sprawdzenie typu mime pliku, np. w ten sposób:
  1. $_avaiable_mimetypes = array('plain/text' , 'application/pdf' , 'application/x-pdf' , 'image/jpg' , 'image/jpeg' , 'image/png' , 'image/gif' , 'image/pjpeg' ,
  2. 'application/vnd.ms-excel' , 'application/msword' , 'application/vnd.ms-powerpoint' );
  3. if (!in_array($_FILES['file']['type'] , $_avaiable_mimetypes)) {
  4. $_errors['file_upload_error'] = '<p><span style="color:#f00;">Nieprawidłowy typ pliku.</span></p>';
  5. }


PS: Kod jest żywcem wycięty, nie bawiłem się w edycję, więc proszę nie pytać, co to jest np. to: $_errors['file_upload_error'] smile.gif
darko
Teoretycznie sprawdzanie typu mime też da się obejść
blooregard
Cytat
Teoretycznie sprawdzanie typu mime też da się obejść

Oczywiście, wszystko da się obejść.
Ale nie jest to już tak trywialne, jak zmiana rozszerzenia.

Ale oczywiście, nic nie stoi na przeszkodzie, by sprawdzać również rozszerzenie. Generalnie - powinno się walidować wszystko, co się da, jeśli dopuszczamy upload plików na serwer przez "niezaufane" źródła (czyli użyszkodników)
Crozin
@blooregard: typ mime z $_FILES jest ustawiany przez przeglądarkę (zobacz sobie na podgląd wysyłanych nagłówków przy pomocy Firebuga). Typ mime powinno się sprawdzać po stronie serwera.
blooregard
Cytat
@blooregard: typ mime z $_FILES jest ustawiany przez przeglądarkę (zobacz sobie na podgląd wysyłanych nagłówków przy pomocy Firebuga). Typ mime powinno się sprawdzać po stronie serwera.

Tak, masz rację, nie wspomniałem o tym:
http://pl.php.net/manual/pl/ref.fileinfo.php
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.