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. $uploaddir=‘c:/wamp/www/xpic/upload/‘;
  14. $target_path=$uploaddir.basename($filename);
  15. // 获得上传文件的扩展名
  16. $fileext= substr(strrchr($filename,"."),1);
  17. print "<pre>File extension : $fileext </pre>";
  18. $serverip = $_SERVER[‘SERVER_ADDR‘];
  19. //判断文件后缀与类型,合法才进行上传操作
  20. if(($fileext == "jpg") && ($filetype=="image/jpeg"))
  21. {
  22. if(move_uploaded_file($tmpname,$target_path))
  23. {
  24. //使用上传的图片生成新的图片
  25. $im = imagecreatefromjpeg($target_path);
  26. //给新图片指定文件名
  27. srand(time());
  28. $newfilename = strval(rand()).".jpg";
  29. print "<pre>new file name $newfilename </pre>";
  30. $newimagepath = $uploaddir.$newfilename;
  31. imagejpeg($im,$newimagepath);
  32. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  33. print ‘<b>New image</b><img src="http://‘.$_SERVER[‘SERVER_ADDR‘].‘/xpic/upload/‘.$newfilename.‘"/>‘;
  34. unlink($target_path);
  35. }
  36. else
  37. {
  38. print "<pre>Your image was not uploaded3. </pre><br/>";
  39. }
  40. }
  41. else
  42. {
  43. print "<pre>Your image was not uploaded2.</pre> <br/>";
  44. }
  45. }
  46. else
  47. {
  48. print "<pre>Your image was not uploaded1.</pre> <br/>";
  49. }
  50. ?>

实验过程

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

时间: 2024-08-12 12:10:22

PHP二次渲染的相关文章

【three.js详解之二】渲染器篇

[three.js详解之二]渲染器篇 本篇文章将详细讲解three.js中渲染器(renderer)的设置方法. three.js文档中渲染器的分支如下: Renderers CanvasRenderer DOMRenderer SVGRenderer WebGLRenderer WebGLRenderTarget WebGLRenderTargetCube WebGLShaders 可以看到three.js提供了很多的渲染方式,我们选择的当然是WebGLRenderer,但我们这里要将Canv

Flask基础(二)---模板渲染中的过滤器定义

Flask中模板渲染中过滤器的定义: from flask import Flask,render_template app = Flask(__name__) @app.route("/") def index(): return render_template("temp-demo2.html") # 方式一 # 自定义过滤器函数,命名不能与内置过滤器重名,不然会覆盖 # 自定义列表切片过滤器 def li_setup2(li): # 按照步长为2进行模板切片

Ogre 渲染目标解析与多文本合并渲染

实现目标 因为需求,想找一个在Ogre中好用的文本显示,经过查找和一些比对.有三种方案 一利用Overlay的2D显示来达到效果. http://www.ogre3d.org/tikiwiki/tiki-index.php?page=MovableTextOverlay 二重写Renderable与MovableObject,利用对应字体查找到每个字符元素纹理坐标. http://www.ogre3d.org/tikiwiki/tiki-index.php?page=MovableText 三利

【Unity Shader】--- 准确认识SubShader语义块结构、渲染状态设定、Tags标签

一[SubShader] 每个UnityShader文件可以包含多个SubShader语义块,但至少要有一个.当Unity需要加载这个UnityShader时,Unity会扫描所有的SubShader语义块,然后选择一个能够在目标平台上运行的SubShader.如果都不支持的话,Unity就会使用FallBack语义指定的UnityShader. Unity提供这种语义的原因在于,不同的显卡具有不同的能力.例如,一些旧的显卡仅能支持一定数目的操作指令,而一些高级的显卡可以支持更多的指令数,那么我

React服务端渲染总结

欢迎吐槽 : ) 本demo地址( 前端库React+mobx+ReactRouter ):https://github.com/Penggggg/react-ssr.本文为笔者自学总结,有错误的地方恳请各位指出 O(∩_∩)O          序:前言.原因与思路.注意事项与问题.详解.       一.前言 为什么需要服务端渲染?什么情况下进行服务端渲染?笔者认为,当我们要求渲染时间尽量快.页面响应速度快时(优点),才会采用服务器渲染,并且应该“按需”对页面进行渲染 ——“首次加载/首屏”

前端进阶——浏览器页面渲染过程

一 .构建 DOM 和 CSSOM 树 浏览器渲染页面前需要先构建 DOM 和 CSSOM 树. 浏览器解析过程大概经过:字节 → 字符 → 令牌 → 节点 → 对象模型. 浏览器处理html页面的方式如下图: 1.转换:浏览器从磁盘或网络读取HTML的原始字节,并根据文件指定的编码将它们转换成各个字符 2.令牌化:浏览器将字符串转换成W3C HTML5标准规定的各种令牌(节点) 3.词法分析:发出的令牌转换成定义其属性和规则的对象 4.DOM构建:根据标记之间的关系构建dom 整个流程的最终输

适应laytpl 渲染模板数据

前言 当我们异步读取数据过来的时候,还要通过手动赋值,显示在页面上吗,那样你就太OUT了,哥告诉你个新方式. 那就是 laytpl 插件 用法一:渲染单条数据 <table id="Box"> <tr> <td>姓名</td><td>性别</td><td>班级</td><td>分数</td> </tr> </table> <input t

Android中自定义视图View之---渲染器Shader对象

下面再来看下一个知识点:颜色渲染Shader对象 为什么我要把Shader对象单独拿出来说一下呢?因为这个对象在对于我们处理图形特效的时候是非常有用的 下面来看一下Android中Shader对象 在Android Api中关于颜色渲染的几个重要的类:Shader,BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient它们之间的关系是: Shader是后面几个类的父类 该类作为基类主要是返回绘制时颜色的横向跨度

服务器端渲染VS浏览器端渲染

1)浏览器渲染和服务器渲染区别:何为渲染?如果我们只是想显示一堆不变的数据,那么我们直接写一个a.html丢到服务器上让客户端访问就可以了.但这是基本不可能的事情,数据一般是变化的.你不可能为每套数据写一个视图,所以我们需要分离数据和视图,然后使用一种技术将数据塞到视图中,这种技术就叫渲染.这工作放在服务器上做就是服务器渲染,放在浏览器做就是浏览器渲染. 这里的渲染,就是指生成html文档的过程,和浏览器渲染html没有关系.浏览器端渲染,指的是用js去生成html,前端做路由.举例:React