Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Upload obrazków - czy jest bezpieczny
Forum PHP.pl > Forum > Przedszkole
nait
Piszę ostatnio mała aplikację i obecnie napisałem upload obrazków. Testowałem i wygląda ok.
Moja pytanie brzmi czy jest on bezpieczny i w miarę dobry/przemyślany?tongue.gif Przejrzałem wcześniej pełno tematów o uploadzie i jego zabezpieczeniu i starałem się zrobić to w nalerzyty sposób rolleyes.gif

Ok poprawiłem tongue.gif

  1. case 'upload':
  2. $directory = $_GET['p'];
  3. $img_name = $_FILES['img_file']['name'];
  4. $img_size = $_FILES['img_file']['size'];
  5.  
  6. //------------------------------------------------------------------//
  7.  
  8. $extension = substr( $img_name, strrpos( $img_name, '.' ) );
  9. $random_name = md5(time( ) . $img_name);
  10. $new_png = $random_name . '.png';
  11. $img_name = $random_name . $extension;
  12. $img_dir = "../uploaded_img/$directory/";
  13. $img_full = $img_dir . $img_name;
  14.  
  15. //------------------------------------------------------------------//
  16.  
  17. $allow_types = array('image/gif', 'image/jpeg', 'image/png', 'image/jpg');
  18. $allow_positions = array('left','center','right');
  19. $px_array = getimagesize($_FILES['img_file']['tmp_name']);
  20.  
  21. //------------------------------------------------------------------//
  22.  
  23. if(!is_uploaded_file($_FILES['img_file']['tmp_name'])) {
  24. AddReport('error', '<b>Błąd</b> - Wybierz plik');
  25. break;
  26. }
  27.  
  28. //------------------------------------------------------------------//
  29.  
  30. elseif(!in_array($_FILES['img_file']['type'], $allow_types, true)) {
  31. AddReport('error', '<b>Błąd</b> - Niedozwolony format pliku');
  32. break;
  33. }
  34.  
  35. //------------------------------------------------------------------//
  36.  
  37. elseif($px_array[0] < 1 || $px_array[1] < 1) {
  38. AddReport('error', '<b>Błąd</b> - Plik nie jest obrazkiem');
  39. break;
  40. }
  41.  
  42. //------------------------------------------------------------------//
  43.  
  44. elseif(!move_uploaded_file( $_FILES[ 'img_file' ][ 'tmp_name' ], $img_full )) {
  45. AddReport('error', '<b>Błąd</b> - Nie można przesłać pliku');
  46. break;
  47. }
  48.  
  49. //------------------------------------------------------------------//
  50.  
  51. else {
  52. chmod($img_full, 0600 );
  53. list($width, $height, $type, $attr) = getimagesize($img_full);
  54.  
  55. //------------------------------------------------------------------//
  56.  
  57. if($type > 3 || $img_size >= 2097152) {
  58. // [IMAGETYPE_GIF] => 1
  59. // [IMAGETYPE_JPEG] => 2
  60. // [IMAGETYPE_PNG] => 3
  61. // 2 MB
  62. unlink($img_full);
  63. AddReport('error', "<b>Błąd</b> - Zbyt duży plik lub niedozwolony format");
  64. break;
  65. }
  66.  
  67. if($width > 400 || $height > 400 ){
  68. $new_dimensions = ScaleImg($width, $height, 400, 400);;
  69. } else {
  70. $new_dimensions['width'] = $width;
  71. $new_dimensions['height'] = $height;
  72. }
  73.  
  74. $img_png = imagecreatetruecolor($new_dimensions['width'], $new_dimensions['height']);
  75.  
  76. switch ($type) {
  77. case 1: // GIF
  78. $img_old = imagecreatefromgif($img_full);
  79. imagealphablending($img_png, false);
  80. imagesavealpha($img_png, true);
  81. imagecopyresampled($img_png,$img_old, 0, 0, 0, 0,
  82. $new_dimensions['width'], $new_dimensions['height'],
  83. $width, $height);
  84. imagepng($img_png, $img_dir.$new_png);
  85. unlink($img_full);
  86. break;
  87.  
  88. case 2: // JPG
  89. $img_old = imagecreatefromjpeg($img_full);
  90. imagecopyresampled($img_png,$img_old, 0, 0, 0, 0,
  91. $new_dimensions['width'], $new_dimensions['height'],
  92. $width, $height);
  93. imagepng($img_png, $img_dir.$new_png);
  94. unlink($img_full);
  95. break;
  96.  
  97. case 3: // PNG
  98. $img_old = imagecreatefrompng($img_full);
  99. imagealphablending($img_png, false);
  100. imagesavealpha($img_png, true);
  101. imagecopyresampled($img_png,$img_old, 0, 0, 0, 0,
  102. $new_dimensions['width'], $new_dimensions['height'],
  103. $width, $height);
  104. imagepng($img_png, $img_dir.$new_png);
  105. break;
  106. }
  107.  
  108. //------------------------------------------------------------------//
  109.  
  110. $query = "INSERT INTO about_img
  111. (id, name)
  112. VALUES
  113. (NULL, '$new_png')";
  114. $result = mysqli_query($connect, $query);
  115. if(!$result) {
  116. AddReport('error', '<b>Błąd</b> - Bład podczas połączenia z bazą danych');
  117. unlink($img_full);
  118. }
  119. if (empty($_SESSION['reports']))
  120. AddReport('success', "<b>Obraz dodany pomyślnie</b>");
  121.  
  122. }
  123.  
  124. break;
  125.  


Działaaaaa zakochany.gif Liczę na cenne sugestie/porady smile.gif

Naprawione, ponawiam wink.gif
erix
  1. elseif(!in_array($_FILES['img_file']['type'], $allow_types, true)) {
  2.  
  3. AddReport('error', '<b>Błąd</b> - Niedozwolony format pliku');
  4.  
  5. break;
  6.  
  7. }

Odpowiedź na pytanie w temacie: nie, nie jest.
nait
W którymś temacie widziałem takie rozwiązanie i pisali że było ok. A więc w jaki sposób lepiej to sprawdzać?

PS
Jeszcze później dodam sprawdzenie czy plik istnieje już na serwie i w bazie.
erix
Cytat
W którymś temacie widziałem takie rozwiązanie i pisali że było ok

Nie jest ok, bo mogę tam wepchnąć, co tylko zechcę po stronie klienta.

Sprawdzaj MIME na serwerze.
nait
Jakaś wskazówka jak/czym to lepiej sprawdzić? getimagesize()?
erix
W zasadzie wystarczy do obrazków.

Ale pamiętaj, że w EXIF-ach można też coś przemycić, a kod PHP raczej nie jest w nich wskazany (źle skonfigurowany serwer jest w stanie wykonać kod z komentarzy w obrazkach).
nait
Dodałem jeszcze sprawdzenie finfo_open(FILEINFO_MIME) styknie już.

Ale mam inne pytanie, jest sens sprawdzania czy plik już istnieje jeśli mam zmienianą nazwę pliku na
  1. $random_name = md5(time( ) . $img_name);
? W zasadzie nie ma szans żeby nazwa się powtórzyła
erix
Teoretycznie jest - w tej samej sekundzie dwie osoby dają identycznie nazwany plik.

Od nazw unikalnych jest uniqid.
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.