Skocz do zawartości

Tworzenie avatara w php


T800

Rekomendowane odpowiedzi

Witam

Stworzyłem stronę z profilem każdego użytkownika mojego serwisu, a teraz zderzyłem się z problemem wgrywania obrazka do awatara danego użytkownika. Samo wgrywanie i skalowanie nie jest problemem, ale zastanawiam się nad bezpieczeństwem.

Plik z obrazem zapisuję jako losowy ciąg znaków (str_shuffle) + właściwe rozszerzenie na końcu, a następnie tą wartość przypisuję w bazie danych do danego użytkownika.

Gdy klient wchodzi w swój profil to w bazie wyszukiwana jest nazwa jego pliku z avatarem, a następnie ładowany jest plik o właśnie takiej nazwie

Cały mechanizm działa prawidłowo, ale proszę o ocenę czy istnieją jakieś ryzyka korzystania z tego sposobu

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Ale jakie ryzyko ma niby być - nie ma ryzyka :)

---

Zakładam, że sprawdzasz typ pliku czy faktycznie jest plikiem jpg, a nie plikiem php którego następnie zły user uruchomi znając jego adres...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Kiedyś miałem sporo problemów z włamywaniem się przez upload.

Ale wystarczyło zrobić tak :

- formularz przyjmuje tylko graficzne rozszerzenia i mime

- po uploadzie za pomocą GD skaluje obrazek a jak nie da rady skalować to usuwa i prosi o następny

- w htaccess blokuje bezpośredni dostęp do obrazka, a obrazkom nadaje prawa lokalne

- dodatkowo w htaccess blokuje możliwość wykonywania skryptu (wyświetlają się zamiast wykonywać)

Dopiero po tych wszystkich zabezpieczeniach mam spokój z włamaniami. Warto poświęcić chwilę, bo przywracanie strony po hacku to nieprzyjemna sprawa.

Wejdź i nakarm głodne dziecko.

baner4.gif

Dziękuję.

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję za pomoc, opanowałem temat, ale wyszedł mi jeszcze jeden problem. Mam założone wymiary avatara 100x100px. Jeżeli po zeskalowaniu wyjdzie obrazek np 80x100, to po prawej i po lewej mam dwa czarne odstępy po 10px każdy.

Czy można w jakiś sposób zdefiniować kolor tych odstępów?

Poniżej kod:

<?php
function forceConstraints($srcFile, $srcType, $dstType, $dstWidth, $dstHeight, $dstPath)
{


  if ($srcType == ".jpg")
         $handle = @imagecreatefromjpeg('upload/'.$srcFile);

  else if ($srcType == ".png")
         $handle = @imagecreatefrompng('upload/'.$srcFile);

  else if ($srcType == ".gif")
         $handle = @imagecreatefromgif('upload/'.$srcFile);

  else
                 { echo "error1";
         return false;}

  if (!$handle) { echo "error5";
         return false;}

  $srcWidth  = @imagesx($handle);
  $srcHeight = @imagesy($handle);

         $newHandle = @imagecreatetruecolor($dstWidth, $dstHeight);
         if (!$newHandle)
                        { echo "error2";
         return false;}


$ratio_orig = $srcWidth/$srcHeight;

if ($dstWidth/$dstHeight > $ratio_orig) {
  $dstWidth = $dstHeight*$ratio_orig;
} else {
  $dstHeight = $dstWidth/$ratio_orig;
}

if ($dstWidth<100) 
($poziom = (100 - $dstWidth)/2);

if ($dstHeight<100)
($pion = (100 - $dstHeight)/2);





         if (!@imagecopyresampled($newHandle, $handle, $poziom, $pion, 0, 0, $dstWidth, $dstHeight, $srcWidth, $srcHeight))
                        { echo "error3";
         return false;}
         @imagedestroy($handle);

         if ($dstType == ".png")
                @imagepng($newHandle, 'upload/'.$dstPath);
         else if ($dstType == ".jpg")
                @imagejpeg($newHandle, 'upload/'.$dstPath);
         else if ($dstType == ".gif")
                @imagegif($newHandle, 'upload/'.$dstPath);
         else
                        { echo "error4";
         return false;}
         @imagedestroy($newHandle);
         return true;
}
?>

Odnośnik do komentarza
Udostępnij na innych stronach

<?php
function forceConstraints($srcFile, $srcType, $dstType, $dstWidth, $dstHeight, $dstPath)
{


  if ($srcType == ".jpg")
	  $handle = @imagecreatefromjpeg('upload/'.$srcFile);

  else if ($srcType == ".png")
	  $handle = @imagecreatefrompng('upload/'.$srcFile);

  else if ($srcType == ".gif")
	  $handle = @imagecreatefromgif('upload/'.$srcFile);

  else
			  { echo "error1";
	  return false;}

  if (!$handle) { echo "error5";
	  return false;}

  $srcWidth  = @imagesx($handle);
  $srcHeight = @imagesy($handle);

	  $newHandle = @imagecreatetruecolor($dstWidth, $dstHeight);
	  $fill_color = imagecolorallocate($newHandle, 255, 0, 0);
	  imagefill($newHandle, 0, 0, $fill_color);

	  if (!$newHandle)
					 { echo "error2";
	  return false;}


$ratio_orig = $srcWidth/$srcHeight;

if ($dstWidth/$dstHeight > $ratio_orig) {
  $dstWidth = $dstHeight*$ratio_orig;
} else {
  $dstHeight = $dstWidth/$ratio_orig;
}

if ($dstWidth<100) 
($poziom = (100 - $dstWidth)/2);

if ($dstHeight<100)
($pion = (100 - $dstHeight)/2);





	  if (!@imagecopyresampled($newHandle, $handle, $poziom, $pion, 0, 0, $dstWidth, $dstHeight, $srcWidth, $srcHeight))
					 { echo "error3";
	  return false;}
	  @imagedestroy($handle);

	  if ($dstType == ".png")
			 @imagepng($newHandle, 'upload/'.$dstPath);
	  else if ($dstType == ".jpg")
			 @imagejpeg($newHandle, 'upload/'.$dstPath);
	  else if ($dstType == ".gif")
			 @imagegif($newHandle, 'upload/'.$dstPath);
	  else
					 { echo "error4";
	  return false;}
	  @imagedestroy($newHandle);
	  return true;
}
?>

To co dopisałem to dwie linijki, pod "$newHandle = @imagecreatetruecolor($dstWidth, $dstHeight);".

Zmienić kolor wypełnienia możesz edytując parametry funkcji imagecolorallocate

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności