PHP 镜像上传安全检查清单

2022-08-30 08:58:03

我正在编写一个脚本以将图像上传到我的应用程序。以下安全步骤是否足以使应用程序在脚本端安全?

  • 禁止 PHP 在上传文件夹中使用 .httaccess 运行。
  • 如果文件名包含字符串“php”,则不允许上传。
  • 只允许扩展名:jpg,jpeg,gif和png。
  • 仅允许图像文件类型。
  • 禁止具有两种文件类型的图像。
  • 更改映像名称。
  • 上传到子目录而不是根目录。

这是我的脚本:

 $filename=$_FILES['my_files']['name'];
 $filetype=$_FILES['my_files']['type'];
 $filename = strtolower($filename);
 $filetype = strtolower($filetype);

 //check if contain php and kill it 
 $pos = strpos($filename,'php');
 if(!($pos === false)) {
  die('error');
 }




 //get the file ext

 $file_ext = strrchr($filename, '.');


 //check if its allowed or not
 $whitelist = array(".jpg",".jpeg",".gif",".png"); 
 if (!(in_array($file_ext, $whitelist))) {
    die('not allowed extension,please upload images only');
 }


 //check upload type
 $pos = strpos($filetype,'image');
 if($pos === false) {
  die('error 1');
 }
 $imageinfo = getimagesize($_FILES['my_files']['tmp_name']);
 if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg'&& $imageinfo['mime']      != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
   die('error 2');
 }
//check double file type (image with comment)
if(substr_count($filetype, '/')>1){
die('error 3')
}

 // upload to upload direcory 
 $uploaddir = 'upload/'.date("Y-m-d").'/' ;

if (file_exists($uploaddir)) {  
} else {  
    mkdir( $uploaddir, 0777);  
}  
  //change the image name
 $uploadfile = $uploaddir . md5(basename($_FILES['my_files']['name'])).$file_ext;



  if (move_uploaded_file($_FILES['my_files']['tmp_name'], $uploadfile)) {
 echo "<img id=\"upload_id\" src=\"".$uploadfile."\"><br />";
  } else {
   echo "error";
  }

欢迎任何新的提示:)


答案 1

使用 GD(或 Imagick)重新处理图像并保存处理后的图像。所有其他的只是黑客的乐趣无聊。

编辑:正如rr指出的那样,用于任何上传。move_uploaded_file()

后期编辑:顺便说一句,您希望对上传文件夹进行非常严格的限制。这些地方是发生许多漏洞的黑暗角落之一。这适用于任何类型的上传和任何编程语言/服务器。检查 https://www.owasp.org/index.php/Unrestricted_File_Upload


答案 2

对于图像文件的安全测试,我可以想到4级证券。它们将是:

  • 级别 1:检查扩展名(扩展名文件以结尾)
  • 级别 2:检查 MIME 类型($file_info = getimagesize($_FILES['image_file']; $file_mime = $file_info['mime'];)
  • 级别 3:读取前 100 个字节并检查它们是否有任何字节位于以下范围内:ASCII 0-8、12-31(十进制)。
  • 级别 4:检查标头中的幻数(文件的前 10-20 个字节)。你可以从这里找到一些文件头字节:http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples

注意:加载整个图像会很慢。


推荐