PHP图片上传安全检查列表

我正在编写脚本将图像上传到我的应用程序。 以下安全措施足以使应用程序从脚本端安全吗?

  • 使用.httaccess禁用PHP在上传文件夹内运行。
  • 如果文件名包含字符串“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";
      }
    

    欢迎任何新的提示:)


    使用GD(或Imagick)重新处理图像并保存处理后的图像。 所有其他人对黑客都很有趣。

    编辑:正如rr指出的,使用move_uploaded_file()进行上传。

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


    对于图像文件的安全测试,我可以考虑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
  • 注意:加载整个图像会很慢。


    XSS警告

    还有一个非常重要的评论。 不要在浏览器中提供/上传任何可以解释为HTML的内容。

    由于这些文件位于您的域中,因此该HTML文档中包含的JavaScript将可以访问您的所有Cookie,从而实现某种XSS攻击。

    攻击场景:

  • 攻击者使用JS代码上传HTML文件,将所有cookie发送到他的服务器。

  • 攻击者通过邮件,下午或仅通过他或任何其他网站上的iframe将链接发送给您的用户。

  • 最安全的解决方案

    使上传的内容仅在子域或其他域上可用。 这种方式cookies不会被访问。 这也是谷歌的性能提示之一:

    https://developers.google.com/speed/docs/best-practices/request#ServeFromCookielessDomain

    链接地址: http://www.djcxy.com/p/46679.html

    上一篇: PHP image upload security check list

    下一篇: Proper MIME media type for PDF files