Ashley Sheridan am Montag, 23. September 2013 - 21:35:

> No, no, no! That is not a good stand-in for fundamental security
> principles!
> 
> This is a better method for ensuring an image is really an image:
> 
> <?php
> if(isset($_FILES['file']))
> {
>       list($width, $height) = getimagesize($_FILES['file']['tmp_name']);
>       if($width && $height)
>       {
>               $source = imagecreatefromjpeg($_FILES['file']['tmp_name']);
>               $dest = imagecreatetruecolor($width, $height);
>               
>               imagecopyresampled($dest, $source,
>               0, 0, 0, 0,
>               $width, $height, $width, $height);
>               imagejpeg($dest, basename($_FILES['file']['tmp_name']));
>       }
>       else
>               echo "{$_FILES['file']['name']} is not a jpeg";
> }
> ?>
> <form enctype="multipart/form-data" method="post">
>       <input type="file" name="file"/>
>       <input type="submit" name="submit" value="submit"/>
> </form>
> 
> Obviously it's only rough, and checks only for jpeg images, but
that's
> easy to alter. I've just tested this with a regular jpeg, the same
jpeg
> with PHP code concatenated onto the end (which still appears to be a
> valid image to viewing/editing software) and a pure PHP file with a
.jpg
> extension. In the case of the first 2, a new jpeg is generated with
the
> same image and without the code. The third example just echoes out an
> error.
> 

Dear Ashley, nice, but useless for this problem!

First, because users may upload other things than images! PDF's, audio
files, videos etc! And on behalf images: GD you are using handles only
jpeg, gif and png. There are about hunderd other image types on the way,
users can upload! How to detect them, if the extension is missleading?

And even if we succeed: As your script demonstrates very well, malicious
code does not affect the rendering of the image. The hacker says: Hi,
this is a nice picture, play it, and then, please do this--follows his
code, that can be a desaster for the whole system.

Yes, your script seems to purge the image file, simply because GD does
not copy the malware code. But why are you sure about that? You cannot
see that code, OK, but may be it was executed in the plain GD
environement? What you are doing is dangerous, because you force the
execution of things that should be never executed!

"no no no" forget it. After all we cannot exclude that users come in
with malware. But we MUST exclude, it is executed on the web server.
That is the Apache chainsaw massacre as Steward whould say. And probably
it can be avoided by purging the filenames (not the files!). 

Nevertheless, the standard configuration of the Apache servers is
basically unacceptable. It must execute user requests and never ever
user files! Period.

Have nice days,
Niklaus 

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to