为什么我的上传图片代码接受avi和flv文件

问题描述:

我编写php代码以允许用户提交图片并将其上传到服务器。我得到它的工作和服务器接收图像。但似乎服务器正在接受甚至.avi和.flv文件。我写if/else语句来检查文件是否是图像,但为什么它不起作用?谢谢为什么我的上传图片代码接受avi和flv文件

这是我的PHP代码

$tmpPath = $_FILES["image"]["tmp_name"]; 
$movedPath = "submit-img/" . $_POST["category"] . "/" . $_FILES["image"]["name"]; 

$fullURL = parse_url($_SERVER['HTTP_REFERER']); 
$query = explode("&", $fullURL["query"]); //only choose first query 
$prevPage = "gallery.php" . "?" . $query[0]; 

//I get the file type here 
$fileType = strpos($_FILES["image"]["type"], "image/"); 

//if its not an image then redirect to the previous page and send a message 
if ($fileType === false || ($_FILES["image"]["size"]) == 0 || $_FILES["image"]["size"]/1024 > 5000){ 
    $prevPage = $prevPage . "&imgSubmit=none#imgSubmitForm"; 
    header("Location: " . $prevPage); 
}else if ($_FILES["image"]["size"] > 0){ //if file is an image 
    if (!is_file($movedPath)){ 
     move_uploaded_file($tmpPath, $movedPath); 
    }else{ 
     while (is_file($movedPath)){  
      $extension = strrchr($movedPath, "."); 
      $movedPath = str_replace($extension, "", $movedPath) . "1" . $extension; 
     } 
     move_uploaded_file($tmpPath, $movedPath); 
    } 
    $prevPage = $prevPage . "&imgSubmit=submitted#imgSubmitForm"; 
    header("Location: " . $prevPage); 

}

+0

你只在哪里过滤图像? – javajavajava 2012-07-09 20:19:31

+0

[文件上传限制某些文件类型]的可能重复(http://*.com/questions/6099968/file-upload-restrict-certain-file-type) – 2012-07-09 20:19:41

+1

它看起来像你只是检查文件是否有扩展名以及文件大小是否不是0且小于5MB。我敢打赌,你可以上传任何文件 – Wug 2012-07-09 20:20:17

}else if ($_FILES["image"]["size"] > 0){ //if file is an image 

该行的注释是从根本上的误导。 $_FILES中的size密钥是以字节为单位的文件大小;它与“文件是否是图像”无关。 (尤其是图像的物理尺寸。)

如果你需要测试一个文件是否是一个图像,最好的办法是使用getimagesize功能。如果图像是PHP识别的图像类型,则此函数将返回图像的大小,如果图像不是图像,则返回零。

不要使用$_FILES数组的type字段来确定文件是否为图像。该字段由浏览器填充,而不是由服务器填充,并且可能包含误导性和/或不完整的错误信息。

+0

谢谢使用的名称。多数民众赞成在 – kaboom 2012-07-09 21:02:03

不是一个答案,但你的代码是非常容易受到攻击:

1)你不检查上传成功,并假定它没有成功。务必检查上传失败,你做任何事情之前:

if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['image']['error']); 
} 

2)您使用的是['type']场为您的验证。这是用户提供的价值,不能被信任。恶意用户可以简单地操纵该值来说image/jpeg,但仍在上传nastyvirus.exe

3)您正在使用['name']字段存储在您的服务器上。这也是用户提供的数据,并且可以被简单地操纵以包括路径信息,例如, ../../../../../../../etc/passwd。由于您盲目使用它,因此您允许恶意用户在服务器上的任何文件上涂写Web服务器有权访问的文件。

+0

感谢指出这些。你能告诉我如何解决数字3?谢谢 – kaboom 2012-07-09 21:02:41