Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie avatara w php
Pozycjonowanie i Optymalizacja > Projektowanie stron > PHP i MySQL
T800
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
Mion
Ale jakie ryzyko ma niby być - nie ma ryzyka ph34r.gif
---
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...
T800
O taką sytuację mi chodzi - mam zaimplementowane rozpoznawanie rozszerzenia, ale czy może zaistnieć sytuacja, gdzie ktoś zmieni rozszerzenie złośliwego programu z php na jpg a następnie spróbuje uruchomic?
nahpl
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.
T800
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:



CODE
<?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;
}
?>
mela
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);
          $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
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-2012 Invision Power Services, Inc.