Jump to content
php.lv forumi

image upload with resize


anonīms

Recommended Posts

principā ir tā, ka:

 

pieņemam ka bildes lauks saucas bilde: <input type="file" name="bilde" />

 

upaudojot failu, tas tiek uplaudots uz temp direktoriju, tam failam var piekļūt ar mainīgo $_FILES['bilde']['tmp_name']

ja skripts tiek darbināts uz linux, tad var darīt šādi:

exec("file -ib ".$_FILES['bilde']['tmp_name'])

ja tā būs png tipa bilde, izvadīsies image/png, ja jpg tad image/jpeg utt

šādi var sadefinēt atļautos bilžu/failu tipus.

 

tad var ar switch palīdzību to visu apstrādāt, piemēram:

 

izveidojam fciju kas apstrādās bildi, pārbaudīs izmērus utt

function apstrada_bildi($bilde, $max_w, $max_h, $save_path)
{
//$bilde tiek padots kā resurss
}
$tips = exec("file -ib ".$_FILES['bilde']['tmp_name']);
switch ($tips)
{
    case 'image/png':
         //darām kas jādara ar png bildi, [url="http://lv.php.net/imagecreatefrompng"]imagecreatefrompng[/url]()
         //apstrada_bildi($bilde, $max_w, $max_h, $save_path);
    break;
    case 'image/jpeg':
         //daraam kas jaadara ar jpeg bilde, parasti ir [url="http://lv.php.net/imagecreatefromjpeg"]imagecreatefromjpeg[/url]()
         //apstrada_bildi($bilde, $max_w, $max_h, $save_path);
    break;
}

 

respektīvi ja tas būs php fails, tad nekas nenotiks un skripta izpildes beigās serveris automātiski temp failu nodzēsīs.

var vēl switch konstruktoru papildināt ar default notikumu, kas izskatīties šādi:

switch ($tips)
{
    case 'image/png':
         //darām kas jādara ar png bildi, [url="http://lv.php.net/imagecreatefrompng"]imagecreatefrompng[/url]()
         //apstrada_bildi($bilde, $max_w, $max_h, $save_path);
    break;
    case 'image/jpeg':
         //daraam kas jaadara ar jpeg bilde, parasti ir [url="http://lv.php.net/imagecreatefromjpeg"]imagecreatefromjpeg[/url]()
         //apstrada_bildi($bilde, $max_w, $max_h, $save_path);
    break;
    default: echo 'Nepareizs faila formāts';
}

 

ja mainīgais $tips būs piemēram: 'application/x-debian-package', tad lietotājam izvadīsies 'Nepareizs faila formāts'.

 

vēl var bildes apstrādāt ar imagemagick fcijām. tās darbosies ātrāk nekā php iebūvētās un patērēs mazāk resursus.

šeit ir paraugi. http://lv.php.net/manual/en/function.imagick-resizeimage.php

Edited by Klez
Link to comment
Share on other sites

Klez - tajā aprakstītajā kā reiz ir minēts, ka faila tipa noteikšana negarantē to, ka neizdarīs kaut ko sliktu. Cik sapratu tad tā ideja ir tāda, ka lielā daļā attēlu ir iespējams ievietot komentārus (piemēram, kad GIMPā saglabā) un ja es komentārā ievadu <? exec('do_bad_things.sh'); ?> tad includējot šo failu, kaut arī ar noticēm (jo attēla bināro daļu php parseris nesapratīs) beigās tiks izpildīts komentārā esošais php kods.

Link to comment
Share on other sites

bet kā tas ietekmē drošību ja bildē ir komentārs <? exec('do_bad_things.sh'); ?>.

lai tas komentārs izpildītos, ko ar to bildi jāiesāk?

 

tipa: include("superbilde.jpeg"); ?

ja tā dara tad tas ir garām.

 

http://www.phpclasses.org/blog/post/67-PHP-security-exploit-with-GIF-images.html

tur palasīju ka var tādas lietas darīt.

 

tad manu iepriekšējo postu vajag papildināt ar:

1) pābaudīt faila paplašinājumu.

$allow_files = array(
   array('image/jpeg', 'jpg');
   array('image/jpeg', 'jpeg');
   array('image/png', 'png');
   array('image/gif', 'gif');
)

tātad ja failam ar paplašinājumu jpg mime tips nav image/jpeg, rādām kļūdu.

 

2) saglabājot bildi noģenerējam jaunu nosaukumu. piem md5(microtime()); un pieliekam jpg paplašinājumu.

3) visas bildes vajadzētu saglabāt kā jpg.

 

ja būs: <img src="supernosaukums.jpg"> tad te neko nevar izdarīt.

 

protams ja taisa include("bilde.jpg"); nu tad jāpamācas php :)

tam vajag izmantot readfile.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...