首页 > 代码库 > PHP二次渲染

PHP二次渲染

首先是前端代码,upload.html

 

[html] view plain copy
 
  1. <html>  
  2.     <head>  
  3.     </head>  
  4.     <body>  
  5.         <form id="form1" name="form1" enctype="multipart/form-data" method="post" action="upload.php">  
  6.             <label>Choose an image to upload  
  7.                 <input type="file" name="uploaded" />  
  8.             </label>  
  9.             <p>  
  10.             <label>  
  11.                 <input type="submit" name="upload" value="upload"/>  
  12.             </label>  
  13.             </p>  
  14.         </form>  
  15.     </body>  
  16. </html>  


后端代码,upload.php

 

 

[php] view plain copy
 
  1. <?php  
  2. if (isset($_POST[‘upload‘]))  
  3. {  
  4.     // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径  
  5.     $filename = $_FILES[‘uploaded‘][‘name‘];  
  6.     $filetype = $_FILES[‘uploaded‘][‘type‘];  
  7.     $filesize = $_FILES[‘uploaded‘][‘size‘];  
  8.     print "<pre> File name : $filename </pre>";  
  9.     print "<pre> File type : $filetype </pre>";  
  10.     print "<pre> File size : $filesize </pre>";  
  11.     $tmpname = $_FILES[‘uploaded‘][‘tmp_name‘];  
  12.     print "<pre> Temp File path : $tmpname </pre>";  
  13.   
  14.     $uploaddir=‘c:/wamp/www/xpic/upload/‘;  
  15.   
  16.     $target_path=$uploaddir.basename($filename);  
  17.   
  18.     // 获得上传文件的扩展名  
  19.     $fileextsubstr(strrchr($filename,"."),1);  
  20.     print "<pre>File extension : $fileext </pre>";  
  21.   
  22.     $serverip = $_SERVER[‘SERVER_ADDR‘];  
  23.   
  24.     //判断文件后缀与类型,合法才进行上传操作  
  25.     if(($fileext == "jpg") && ($filetype=="image/jpeg"))  
  26.     {  
  27.   
  28.         if(move_uploaded_file($tmpname,$target_path))  
  29.         {  
  30.             //使用上传的图片生成新的图片  
  31.             $im = imagecreatefromjpeg($target_path);  
  32.   
  33.             //给新图片指定文件名  
  34.             srand(time());  
  35.             $newfilename = strval(rand()).".jpg";  
  36.             print "<pre>new file name $newfilename </pre>";  
  37.             $newimagepath = $uploaddir.$newfilename;  
  38.             imagejpeg($im,$newimagepath);  
  39.             //显示二次渲染后的图片(使用用户上传图片生成的新图片)  
  40.             print ‘<b>New image</b><img src="http://‘.$_SERVER[‘SERVER_ADDR‘].‘/xpic/upload/‘.$newfilename.‘"/>‘;  
  41.             unlink($target_path);  
  42.         }  
  43.         else  
  44.         {  
  45.             print "<pre>Your image was not uploaded3. </pre><br/>";  
  46.         }  
  47.   
  48.     }  
  49.     else  
  50.     {  
  51.         print "<pre>Your image was not uploaded2.</pre> <br/>";  
  52.     }  
  53.   
  54. }  
  55.   
  56. else  
  57. {  
  58.     print "<pre>Your image was not uploaded1.</pre> <br/>";  
  59. }  
  60.   
  61. ?>  

 

 

实验过程

首先选择一张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。

PHP二次渲染