加快图像转换时间

时间:2014-02-07 01:49:37

标签: php mysql image-uploading malware-detection

如果这是一个新问题,请原谅我。我编写了一个php文件上传器。在听说黑客可以将代码附加/伪装到图像以感染网站之后,我有了解决这个问题的想法。将上传图像转换为另一种文件格式(png),然后转换为另一种(jpg),质量为70%。这导致恶意软件损坏。问题是,这个总转换过程需要大约1分钟的最高速度。我正在进行的服务需要快速处理文件上传,以便用户可以开展工作。我怎样才能加快这个过程?上传代码如下(重要变量被清空)。

// upload the file
$status = "...recieving the file...";
move_uploaded_file($_FILES["file"]["tmp_name"], "$folder" . $_FILES["file"]["name"]);
$status = "...processing the file...";

// convert the file to destroy viruses
$filename21 = "$folder" . $_FILES["file"]["name"];
imagepng(imagecreatefromstring(file_get_contents($filename21)), "$folder"."debug.".$picture_newname.".png");
$imageTmp=imagecreatefrompng("$folder"."debug.".$picture_newname.".png");
imagejpeg($imageTmp, "$folder".$picture_newname.".jpg", 90);
imagedestroy($imageTmp);

以下是以下步骤:

  1. 扫描数据库以查找同名文件
  2. 如果找到具有相同名称的文件,请重命名当前上载
  3. 收到文件
  4. “评估”文件(双重转换过程以保护服务器)
  5. 将信息插入上传数据库
  6. 如果需要任何其他代码(或者我应该多做一些时间),请告诉我。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是一个疯狂的想法。您不仅要在服务器之间转换图像格式,还会降低每个上传图像的质量。

我建议采用不同的方法

  1. 上传文件时,使用PHP的getimagesize()功能检查图像。如果此函数返回FALSE(或意外的图像类型或奇怪的尺寸等),则文件已损坏且可以删除。

  2. 使用exiftool或类似内容删除上传文件中的所有元数据,然后再将其存储在服务器上。这样您就可以确保文件只包含图像数据。

  3. 在您使用它来保存服务器上的文件之前,也许您可​​以检查$_FILES["file"]["name"]的值是否包含../../之类的偷偷摸摸的内容。

答案 1 :(得分:1)

由于DoS攻击,出于安全目的实现双重转换是完全不好的主意。 速度和速度之间的平衡解决方案安全必须包含:

  1. 检查MIME类型。
  2. 检查文件扩展名。
  3. 检查文件大小。 (强烈推荐)
  4. 检查图像尺寸。 (可选,取决于应用要求)
  5. 这样的事情:

    $allowable_types = array(
        'png'  => 'image/png',
        'jpeg' => 'image/jpeg',
        'gif'  => 'image/gif'
    );
    $max_file_size = 10240; // 10K limit example
    
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $type  = $finfo->file($_FILES['name']['tmp_name']);
    $size  = filesize($_FILES['name']['tmp_name']);
    $info  = pathinfo($_FILES['name']['tmp_name']); 
    
    if (isset($allowable_types[$info['extension']])
        and $type === $allowable_types[$info['extension']] 
        and $size <= $max_file_size
    ) {
        // check image size if your app require this
        move_uploaded_file($_FILES['name']['tmp_name'], $destination);
    }
    

    <强>更新

    我不建议在目标路径中使用$_FILES['file']['name']或扫描整个目录中的相同名称。由于一些安全漏洞和性能下降。更好的解决方案是为每个图像生成唯一的名称:

    $new_name = uniquid() . '.' . $info['extension'];
    $destination = $upload_path . $new_name;