首先是前端代码,upload.html
[html] view plain copy
- <html>
- <head>
- </head>
- <body>
- <form id="form1" name="form1" enctype="multipart/form-data" method="post" action="upload.php">
- <label>Choose an image to upload
- <input type="file" name="uploaded" />
- </label>
- <p>
- <label>
- <input type="submit" name="upload" value="upload"/>
- </label>
- </p>
- </form>
- </body>
- </html>
后端代码,upload.php
[php] view plain copy
- <?php
- if (isset($_POST[‘upload‘]))
- {
- // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
- $filename = $_FILES[‘uploaded‘][‘name‘];
- $filetype = $_FILES[‘uploaded‘][‘type‘];
- $filesize = $_FILES[‘uploaded‘][‘size‘];
- print "<pre> File name : $filename </pre>";
- print "<pre> File type : $filetype </pre>";
- print "<pre> File size : $filesize </pre>";
- $tmpname = $_FILES[‘uploaded‘][‘tmp_name‘];
- print "<pre> Temp File path : $tmpname </pre>";
- $uploaddir=‘c:/wamp/www/xpic/upload/‘;
- $target_path=$uploaddir.basename($filename);
- // 获得上传文件的扩展名
- $fileext= substr(strrchr($filename,"."),1);
- print "<pre>File extension : $fileext </pre>";
- $serverip = $_SERVER[‘SERVER_ADDR‘];
- //判断文件后缀与类型,合法才进行上传操作
- if(($fileext == "jpg") && ($filetype=="image/jpeg"))
- {
- if(move_uploaded_file($tmpname,$target_path))
- {
- //使用上传的图片生成新的图片
- $im = imagecreatefromjpeg($target_path);
- //给新图片指定文件名
- srand(time());
- $newfilename = strval(rand()).".jpg";
- print "<pre>new file name $newfilename </pre>";
- $newimagepath = $uploaddir.$newfilename;
- imagejpeg($im,$newimagepath);
- //显示二次渲染后的图片(使用用户上传图片生成的新图片)
- print ‘<b>New image</b><img src="http://‘.$_SERVER[‘SERVER_ADDR‘].‘/xpic/upload/‘.$newfilename.‘"/>‘;
- unlink($target_path);
- }
- else
- {
- print "<pre>Your image was not uploaded3. </pre><br/>";
- }
- }
- else
- {
- print "<pre>Your image was not uploaded2.</pre> <br/>";
- }
- }
- else
- {
- print "<pre>Your image was not uploaded1.</pre> <br/>";
- }
- ?>
实验过程
首先选择一张lena图,在图片末端写入一句话后门代码,最终保存格式为jpg
查看它的文件源码
上传图片
结果浏览器中显示
此时,在程序的同路径下的upload文件夹内就存有上传后的照片
此时再看图片源码发现之前后缀在图片中的PHP代码已经不见了。
实验成功,图片木马中的php代码被破坏。
在使用php中那些与图像处理有关的函数时,需要将GD2的DLL文件php_gd2.dll作为一个扩展包含在php.ini中。
在上述实验中,php的版本为5.3.10,其默认已经将DLL文件包含,即extension=php_gd2.dll。
源代码中有两个重要的函数分别是imagecreatefromjpeg()和imagejpeg()。函数细节如下:
1.imagecreatefromjpeg:由文件或 URL 创建一个新图象。
resource imagecreatefromjpeg ( string $filename )
参数:filename:JPEG图像的路径。
返回值:成功后返回图像资源,失败后返回FALSE。
2.imagejpeg:输出图象到浏览器或文件。
bool imagejpeg(resource $image[,string $filename[,int $quality]])
imagejpeg()从image图像以filename为文件名创建一个JPEG图像。
参数:image:由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
filename:文件保存的路径,如果未设置或为NULL,将会直接输出原始图象流。如果要省略这个参数而提供 quality 参数,使用NULL。
quality:quality 为可选项,范围从0(最差质量,文件更小)到100(最佳质量,文件最大)。默认为IJG默认的质量值(大约75)。
返回值:成功时返回TRUE,或者在失败时返回FALSE。