2009-10-23 101 views
1

嗨,我试图上传一个图像使用PHP脚本。和什么很奇怪的是我只在Internet Explorer中收到以下错误地方有什么脚本正常工作:PHP中的文件上传问题

Warning: move_uploaded_file(pictures/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpcJnHZE' to 'pictures/' in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: copy() [function.copy]: The first argument to copy() function cannot be a directory in /home/tntauto1/public_html/admin_add1.php on line 60 

下面是脚本:

if(is_uploaded_file($_FILES['image']['tmp_name'])){ 
    if($_FILES['image']['type'] == 'image/jpeg'){ 
     $original = 'original_'.$v_id.'.jpg'; 
     $large = 'large_'.$v_id.'.jpg'; 
     $small = 'small_'.$v_id.'.jpg'; 

    }elseif($_FILES['image']['type'] == 'image/gif'){ 
     $original = 'original_'.$v_id.'.gif'; 
     $large = 'large_'.$v_id.'.gif'; 
     $small = 'small_'.$v_id.'.gif'; 
    }else{ 
     $error = 'Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.'; 
    } 
    if(move_uploaded_file($_FILES['image']['tmp_name'],'pictures/'.$large)){} 
     copy('pictures/'.$large,'pictures/'.$small); 

    $imgsize = getimagesize('pictures/'.$large); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>---- Resize to 480 X 360 
    $width = $imgsize[0]; 
    $height = $imgsize[1]; 
    if(($width > 480) || ($height > 360)){//resize the image 
     $ratio = $width/$height; 
     if(100/$ratio >= 80){//calculates if height of uploaded image is too large 
      $new_width = floor(360 * $ratio); 
      $new_height = 360; 
     }elseif(150 * $ratio > 100){// calculate if width of uploaded image is too large 
      $new_width = 480; 
      $new_height = floor(480/$ratio); 
     } 
     if($_FILES['image']['type'] == 'image/jpeg'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
     if($_FILES['image']['type'] == 'image/gif'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
    } 
+0

嘿,谢谢大家的意见。没有通过文件类型$ _FILES ['name'] ['type']修复它。 (对不起,我没有提到$大变量是在我之前没有发布的脚本中定义的) – Ross 2009-10-23 18:19:33

回答

6
if($_FILES['image']['type'] == 'image/jpeg'){ 

切勿依赖浏览器提交的MIME类型。

在这种情况下,您的问题是大卫暗示:IE通常(错误地)为JPEG提供image/pjpeg,所以您正在检测未知的文件类型并将$ error设置为Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format. ...但尽管如此,您仍尝试无论如何移动文件,尽管没有设置$ small或$ large。

但更重要的是,浏览器提交的类型可能是完全错误的。你不能相信上传的文件名或媒体类型是合适的,所以甚至不要去检查它们。相反,在您调用getimagesize以查明PHP认为图像是什么类型之后,请查看$imgsize[2]

而且,如果您接受来自一般用户的图片上传,则会出现安全问题。完全可以创建包含HTML标签的有效GIF(或其他文件类型)。然后,当血腥愚蠢的IE浏览器自动访问GIF作为一个页面时,它会检测到HTML标签,决定您告诉它的内容类型是否是错误的,并将其解释为HTML页面,包括任何那里的JavaScript,然后在您的网站的安全上下文中执行。

如果您必须允许从不受信任的来源进行文件上传,并且您没有自己处理图片(这通常会有删除不需要的HTML的副作用),您通常必须从不同的主机名避免他们脚本进入您的网站。

+0

不知道你可以在图像中嵌入HTML。人们会怎么做?更重要的是,如何检测上传的图像是否包含HTML标签并据此进行处理? – akinuri 2016-08-11 04:27:27

+0

这是一个有趣的例子:http://lcamt​​uf.coredump.cx/squirrel/。试图在任意文件中检测标签是一个相当注定的approuach,因为你必须使用与浏览器相同的启发式方法,这些浏览器是可变的和无证的。相反,如上所述,从不同的主机名提供您的用户内容,以便如果它得到的XSS不能控制您的主站点。 – bobince 2016-08-12 20:36:19

+0

非常有趣。当我检查图像文件时,我可以看到HTML标签。一些人建议从上传的图像中创建一个新图像,以删除文件和/或元数据中可能的HTML和脚本。这会起作用吗?我正在考虑发布一个关于我的特定情况的问题。 – akinuri 2016-08-12 22:29:12

0

不能移动目录,因为$大没有价值,或被重置。

3
if($FILES['image']['type'] == 'image/jpeg'){ 

保存文件上传数据的变量应为$_FILES。由于$FILES是一个空的(刚刚使用的)变量,因此您的$large变量也是空的,因此您正在将文件移动到pictures/这是一个目录,就像PHP告诉您的一样。你的$error也应该包含错误消息,因为它们之前都没有if。

避免这种错误的一种方法是用error_reporting设置为E_ALL开发,该应用程序会显示一个通知,指出您的$FILES变量(错字)未定义。

+0

无视这个答案,它看起来好像只是因为错误格式化问题而造成了错字这里。我同意david.scheider的回答,在从IE上传时检查返回的MIME类型。 – Marko 2009-10-23 17:48:07