如果这是一个新问题,请原谅我。我编写了一个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);
以下是以下步骤:
如果需要任何其他代码(或者我应该多做一些时间),请告诉我。在此先感谢您的帮助。
答案 0 :(得分:2)
这是一个疯狂的想法。您不仅要在服务器之间转换图像格式,还会降低每个上传图像的质量。
我建议采用不同的方法
上传文件时,使用PHP的getimagesize()功能检查图像。如果此函数返回FALSE
(或意外的图像类型或奇怪的尺寸等),则文件已损坏且可以删除。
使用exiftool或类似内容删除上传文件中的所有元数据,然后再将其存储在服务器上。这样您就可以确保文件只包含图像数据。
在您使用它来保存服务器上的文件之前,也许您可以检查$_FILES["file"]["name"]
的值是否包含../../
之类的偷偷摸摸的内容。
答案 1 :(得分:1)
由于DoS攻击,出于安全目的实现双重转换是完全不好的主意。 速度和速度之间的平衡解决方案安全必须包含:
这样的事情:
$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;