【问题标题】:Image upload security - reprocess with GD图像上传安全 - 使用 GD 重新处理
【发布时间】:2012-04-02 23:40:48
【问题描述】:

我听说处理上传图像的最佳方法是使用GD 库“重新处理”它们并保存处理后的图像。见:PHP image upload security check list

我的问题是如何在GD 中“重新处理”?这究竟意味着什么?我对GD库不是很了解,怕搞砸了……

那么,如果有人以前这样做过,你能给我举个例子吗?

(我知道,另一个选择是使用 ImageMagick。对于 ImageMagick,我在这里找到了答案:Remove EXIF data from JPG using PHP,但我现在不能使用 ImgMagick。顺便说一句.. 删除 EXIF 数据意味着完全重新创建图像这种情况?)
(如果有人感兴趣,我正在使用 Zend Framework。)

【问题讨论】:

    标签: php security zend-framework gd


    【解决方案1】:
    function isvalidjpeg($file) 
    { 
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    return is_resource($finfo) && 
           (finfo_file($finfo, $file) === 'image/jpeg') && 
           finfo_close($finfo);
    }
    if(isvalidjpeg($_FILES['file']['tmp_name'])) {
       $newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']); .....
    

    【讨论】:

      【解决方案2】:

      如果用户上传 JPEG 文件,您可以执行以下操作来重新处理它:

      $newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']);
      if (!$newIm) {
          // gd could not create an image from the source
          // most likely, the file was not a valid jpeg image
      }
      

      然后您可以使用imagedestroy() 丢弃$newIm 图像并使用用户上传的文件,或者保存来自GD 的图像并使用它。保存 GD 图像可能会出现一些问题,因为它不是原始图像。

      另一个简单的方法是检查图像文件的标题(前几个字节)以确保它是正确的;例如,所有 JPEG 文件都以 0xff 0xd8 开头。

      另见imagecreatefromstring(),您也可以使用getimagesize() 对上传的图片进行类似检查。

      【讨论】:

      • Quote (getimagesize) "注意这个函数要求文件名是一个有效的图像文件。如果提供了一个非图像文件,它可能被错误地检测为图像并且函数会成功返回,但是数组可能包含无意义的值。请勿使用 getimagesize() 来检查给定文件是否为有效图像。请改用专用解决方案,例如 Fileinfo 扩展。"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2019-12-29
      相关资源
      最近更新 更多