Klez Posted September 25, 2009 Report Share Posted September 25, 2009 (edited) 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 September 25, 2009 by Klez Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted September 25, 2009 Report Share Posted September 25, 2009 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. Quote Link to comment Share on other sites More sharing options...
Klez Posted September 25, 2009 Report Share Posted September 25, 2009 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. Quote Link to comment Share on other sites More sharing options...
Val Posted September 25, 2009 Report Share Posted September 25, 2009 vēl derētu arī pārbaude uz attēla izmēriem (px). Quote Link to comment Share on other sites More sharing options...
Klez Posted September 25, 2009 Report Share Posted September 25, 2009 ko tu gribi pārbaudīt tajos pikseļos ? nu principā ir tā, ka 1) nodefinējam max W un H 2) nodefinējam min W un H 3) vēl vajag padomāt par to ka bilde var būt horizontāli un vertikāli. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.