0

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

这是我的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);

}

4

2 回答 2

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

对这一行的评论从根本上具有误导性。size关键$_FILES是文件的大小(以字节为单位);它与“文件是否为图像”无关。(特别是,它不是图像的物理尺寸。)

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

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

于 2012-07-09T20:33:20.087 回答
0

不是答案,但您的代码很容易受到攻击:

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. 由于您盲目地使用它,因此您允许恶意用户在您的服务器上任何网络服务器有权访问的文件上乱涂乱画。

于 2012-07-09T20:36:12.857 回答